mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2026-01-09 12:42:39 +01:00
afaef
This commit is contained in:
parent
2a63dbb4f7
commit
60ff78619a
BIN
Applications/.DS_Store
vendored
BIN
Applications/.DS_Store
vendored
Binary file not shown.
@ -1,77 +1,107 @@
|
||||
local robot = require("robot")
|
||||
local component = require("component")
|
||||
|
||||
_G.robotAPI, package.loaded.robotAPI = nil, nil
|
||||
|
||||
local robotAPI = require("robotAPI")
|
||||
local inventory = component.inventory_controller
|
||||
local sides = require("sides")
|
||||
local component = require("component")
|
||||
local inventoryController = component.inventory_controller
|
||||
local robotComponent = component.robot
|
||||
|
||||
local args = { ... }
|
||||
if #args < 3 then print(" "); print("Использование: diamonds <длина> <высота> <ширина>"); print(" "); return end
|
||||
-----------------------------------------------------------------
|
||||
|
||||
local length = args[1]
|
||||
local height = args[2]
|
||||
local width = args[3]
|
||||
local args = {...}
|
||||
if not (args[1] and args[2] and args[3]) then
|
||||
print("Usage: diamonds <length> <height> <width> <torch cyka>")
|
||||
return
|
||||
end
|
||||
|
||||
local moves = {
|
||||
|
||||
}
|
||||
local length, height, width, torchFrequency = tonumber(args[1]), tonumber(args[2]), tonumber(args[3]), tonumber(args[4] or 7)
|
||||
local torchCount, torchSlot
|
||||
|
||||
local function swingForLength()
|
||||
for i = 1, length do
|
||||
robotAPI.move("forward")
|
||||
robot.swingDown()
|
||||
robot.swingUp()
|
||||
-----------------------------------------------------------------
|
||||
|
||||
local function getItemSlotAndCount(item)
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack and stack.name == item then
|
||||
return slot, stack.size
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function swingForUp()
|
||||
for i = 1, 3 do
|
||||
robotAPI.move("up")
|
||||
|
||||
local function doLength()
|
||||
for l = 1, length do
|
||||
robotAPI.moveForward()
|
||||
robotAPI.swingUp()
|
||||
robotAPI.swingDown()
|
||||
if l % torchFrequency == 0 and torchSlot and torchCount > 0 and robotAPI.robotPosition.y == 0 then
|
||||
robotComponent.select(torchSlot)
|
||||
robotComponent.place(sides.down)
|
||||
torchCount = torchCount - 1
|
||||
end
|
||||
end
|
||||
|
||||
robotAPI.tryToDropShittyResources()
|
||||
robotAPI.checkGeneratorStatus()
|
||||
robotAPI.checkEnergyStatus()
|
||||
robotAPI.checkToolStatus()
|
||||
end
|
||||
|
||||
local function doHeight()
|
||||
for h = 1, height do
|
||||
doLength()
|
||||
for i = 1, 3 do robotAPI.moveUp() end
|
||||
robotAPI.turnAround()
|
||||
doLength()
|
||||
robotAPI.turnAround()
|
||||
if h < height then for i = 1, 3 do robotAPI.moveUp() end end
|
||||
end
|
||||
end
|
||||
|
||||
local function swingForDown()
|
||||
for i = 1, 3 do
|
||||
robotAPI.move("down")
|
||||
local function doWidth()
|
||||
for w = 1, width do
|
||||
doHeight()
|
||||
for i = 1, height * 3 * 2 - 3 do robotAPI.moveDown() end
|
||||
|
||||
if w < width then
|
||||
robotAPI.turnRight()
|
||||
for i = 1, 3 do robotAPI.moveForward() end
|
||||
robotAPI.turnLeft()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Перебираем все ширины
|
||||
for i = 1, width do
|
||||
--Перебираем все высоты для конкретной ширины
|
||||
for i = 1, height do
|
||||
swingForLength()
|
||||
robot.turnAround()
|
||||
swingForUp()
|
||||
swingForLength()
|
||||
robot.turnAround()
|
||||
swingForUp()
|
||||
--Выбрасываем говно
|
||||
robotAPI.dropShmot()
|
||||
end
|
||||
-----------------------------------------------------------------
|
||||
|
||||
--Возвращаемся по высоте на конкретной ширине
|
||||
for i = 1, (height * 2) do
|
||||
swingForDown()
|
||||
end
|
||||
|
||||
--Двигаемся к следующей ширине
|
||||
robot.turnRight()
|
||||
|
||||
for i = 1, 3 do
|
||||
robotAPI.move("forward")
|
||||
end
|
||||
|
||||
robot.turnLeft()
|
||||
-- Ставим стартовый сундук
|
||||
local chestSlot = getItemSlotAndCount("minecraft:chest")
|
||||
if chestSlot then
|
||||
robotAPI.turnAround()
|
||||
robotComponent.select(chestSlot)
|
||||
robotComponent.place(sides.front)
|
||||
robotAPI.turnAround()
|
||||
end
|
||||
|
||||
--Возвращаемся домой из последней ширины
|
||||
robot.turnLeft()
|
||||
-- Получаем слот факела
|
||||
torchSlot, torchCount = getItemSlotAndCount("minecraft:torch")
|
||||
|
||||
for i = 1, width do
|
||||
for j = 1, 3 do
|
||||
robotAPI.move("forward")
|
||||
end
|
||||
-- Ебошим
|
||||
doWidth()
|
||||
|
||||
-- Пиздуем назад
|
||||
robotAPI.returnToStartPoint()
|
||||
|
||||
-- Скидываем говно в сундук, если он ваще был
|
||||
if chestSlot then
|
||||
robotAPI.turnAround()
|
||||
robotAPI.dropAllResources(sides.front)
|
||||
robotAPI.turnAround()
|
||||
end
|
||||
|
||||
robot.turnRight()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
413
Applications/Robot/GeoMiner.lua
Normal file
413
Applications/Robot/GeoMiner.lua
Normal file
@ -0,0 +1,413 @@
|
||||
|
||||
local computer = require("computer")
|
||||
local component = require("component")
|
||||
local robot = require("robot")
|
||||
local event = require("event")
|
||||
local sides = require("sides")
|
||||
local geo = component.geolyzer
|
||||
local inventoryController = component.inventory_controller
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
local fuels = {
|
||||
"minecraft:coal",
|
||||
"minecraft:lava_bucket",
|
||||
"minecraft:coal_block",
|
||||
}
|
||||
|
||||
local shittyResources = {
|
||||
"minecraft:cobblestone",
|
||||
"minecraft:grass",
|
||||
"minecraft:dirt",
|
||||
"minecraft:gravel",
|
||||
"minecraft:sand",
|
||||
"minecraft:sandstone",
|
||||
"minecraft:torch",
|
||||
"minecraft:planks",
|
||||
"minecraft:fence",
|
||||
"minecraft:chest",
|
||||
"minecraft:monster_egg",
|
||||
"minecraft:stonebrick",
|
||||
}
|
||||
|
||||
local oreSearchRadius = 24
|
||||
local searchPassesCount = 5
|
||||
local minimumOreHardness = 2.5
|
||||
local maximumOreHardness = 9
|
||||
local replaceToolDurabilityTrigger = 0.05
|
||||
local replaceToolRegex = "(minecraft:).+(_pickaxe)"
|
||||
local rechargeTrigger = 0.1
|
||||
local dropShittyResourcesOnEmptySlots = 5
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
local program = {}
|
||||
local robotPosition = {x = 0, y = 0, z = 0, rotation = 0}
|
||||
local energyStatusCheckEnabled = true
|
||||
local toolStatusCheckEnabled = true
|
||||
local generatorIsAvailable = component.isAvailable("generator")
|
||||
|
||||
function program.scan(radius, passes, minHardness, maxHardness)
|
||||
local ores = {}
|
||||
|
||||
-- Заносим все руды в массивыч руд
|
||||
for pass = 1, passes do
|
||||
print("Scan pass " .. pass .. " started...")
|
||||
for x = -radius, radius do
|
||||
for z = -radius, radius do
|
||||
local stack = geo.scan(x, z, true)
|
||||
for y = 1, #stack do
|
||||
if stack[y] >= minHardness and stack[y] <= maxHardness then
|
||||
-- Заполняем координатную сетку, если массивов еще не существует
|
||||
ores[x] = ores[x] or {}
|
||||
ores[x][y] = ores[x][y] or {}
|
||||
|
||||
-- Если мы уже сканировали этот блок, то получаем среднюю плотность из двух значений
|
||||
-- Если нет, то банально ставим полученное значение
|
||||
if ores[x][y][z] then
|
||||
ores[x][y][z] = (ores[x][y][z] + stack[y]) / 2
|
||||
else
|
||||
ores[x][y][z] = stack[y]
|
||||
end
|
||||
|
||||
-- print("x=" .. x .. ", y=" .. y .. ", z=" .. z .. ", hardness=" .. stack[y])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Проверяем энергосостояние, а то уже один раз вылетело с ошибкой нот еаугх ЕНЕРГИ, БЛЯДЬ!!11
|
||||
program.checkEnergyStatus()
|
||||
end
|
||||
end
|
||||
|
||||
-- Переебошиваем массив руд для более удобной работы с ним в линейном формате
|
||||
-- Не забываем подчищать говнище за собой, а то роботы не резиновые
|
||||
local newOres = {}
|
||||
for x in pairs(ores) do
|
||||
for y in pairs(ores[x]) do
|
||||
for z in pairs(ores[x][y]) do
|
||||
table.insert(newOres, {x = robotPosition.x + x, y = robotPosition.y + y - 33, z = robotPosition.z + z})
|
||||
ores[x][y][z] = nil
|
||||
end
|
||||
ores[x][y] = nil
|
||||
end
|
||||
ores[x]= nil
|
||||
end
|
||||
|
||||
return newOres
|
||||
end
|
||||
|
||||
local function getHardness(x, z)
|
||||
local stack = geo.scan(x, z)
|
||||
for i = 1, #stack do
|
||||
print("i=" .. i .. ", val=" .. stack[i])
|
||||
event.pull("key_down")
|
||||
end
|
||||
end
|
||||
|
||||
function program.move(direction)
|
||||
while true do
|
||||
local swingSuccess, swingReason = component.robot.swing(direction)
|
||||
if swingSuccess or swingReason == "air" then
|
||||
local moveSuccess, moveReason = component.robot.move(direction)
|
||||
if moveSuccess then
|
||||
break
|
||||
end
|
||||
else
|
||||
if swingReason == "block" then
|
||||
print("Unbreakable block detected, going to base")
|
||||
program.returnToBase()
|
||||
os.exit()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if direction == sides.front or direction == sides.back then
|
||||
local directionOffset = direction == sides.front and 1 or -1
|
||||
|
||||
if robotPosition.rotation == 0 then
|
||||
robotPosition.x = robotPosition.x + directionOffset
|
||||
elseif robotPosition.rotation == 1 then
|
||||
robotPosition.z = robotPosition.z + directionOffset
|
||||
elseif robotPosition.rotation == 2 then
|
||||
robotPosition.x = robotPosition.x - directionOffset
|
||||
elseif robotPosition.rotation == 3 then
|
||||
robotPosition.z = robotPosition.z - directionOffset
|
||||
end
|
||||
elseif direction == sides.up or direction == sides.down then
|
||||
local directionOffset = direction == sides.up and 1 or -1
|
||||
robotPosition.y = robotPosition.y + directionOffset
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function program.returnToBase()
|
||||
program.gotoPoint(0, robotPosition.y, 0)
|
||||
program.turnToRequiredRotation(0)
|
||||
program.gotoPoint(0, -2, 0)
|
||||
program.tryToDropShittyResources()
|
||||
program.gotoPoint(0, 0, 0)
|
||||
program.dropAllResoucesIntoBaseChest()
|
||||
end
|
||||
|
||||
function program.getSlotWithFuel()
|
||||
for slot = 1, component.robot.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
for fuel = 1, #fuels do
|
||||
if stack.name == fuels[fuel] then
|
||||
return slot
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function program.tryToRechargeByGenerator()
|
||||
if generatorIsAvailable then
|
||||
if component.generator.count() == 0 then
|
||||
print("Generator is empty, trying to find some fuel in inventory")
|
||||
local slot = program.getSlotWithFuel()
|
||||
if slot then
|
||||
print("Found slot with fuel: " .. slot)
|
||||
local oldSlot = robot.select(slot)
|
||||
component.generator.insert()
|
||||
robot.select(oldSlot)
|
||||
return
|
||||
else
|
||||
print("Slot with fuel not found")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function program.checkEnergyStatus()
|
||||
if computer.energy() / computer.maxEnergy() < rechargeTrigger then
|
||||
print("Low energy level detected")
|
||||
energyStatusCheckEnabled = false
|
||||
-- Запоминаем старую позицию, шобы суда вернуться
|
||||
local oldPosition = {x = robotPosition.x, y = robotPosition.y, z = robotPosition.z, rotation = robotPosition.rotation}
|
||||
-- Пиздуем на базу за зарядкой
|
||||
program.returnToBase()
|
||||
-- Заряжаемся, пока энергия не достигнет более-менее максимума
|
||||
while computer.energy() / computer.maxEnergy() < 0.99 do
|
||||
print("Charging up: " .. math.floor(computer.energy() / computer.maxEnergy() * 100) .. "%")
|
||||
os.sleep(1)
|
||||
end
|
||||
-- Пиздуем обратно
|
||||
program.gotoPoint(oldPosition.x, oldPosition.y, oldPosition.z)
|
||||
program.turnToRequiredRotation(oldPosition.rotation)
|
||||
energyStatusCheckEnabled = true
|
||||
end
|
||||
end
|
||||
|
||||
function program.turn(clockwise)
|
||||
component.robot.turn(clockwise)
|
||||
robotPosition.rotation = robotPosition.rotation + (clockwise and 1 or -1)
|
||||
if robotPosition.rotation > 3 then
|
||||
robotPosition.rotation = 0
|
||||
elseif robotPosition.rotation < 0 then
|
||||
robotPosition.rotation = 3
|
||||
end
|
||||
end
|
||||
|
||||
function program.turnToRequiredRotation(requiredRotation)
|
||||
local difference = robotPosition.rotation - requiredRotation
|
||||
|
||||
if difference ~= 0 then
|
||||
local fastestWay
|
||||
if difference > 0 then
|
||||
if difference > 2 then fastestWay = true else fastestWay = false end
|
||||
else
|
||||
if -difference > 2 then fastestWay = false else fastestWay = true end
|
||||
end
|
||||
|
||||
while robotPosition.rotation ~= requiredRotation do
|
||||
program.turn(fastestWay)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function program.gotoPoint(xTarget, yTarget, zTarget)
|
||||
local xDistance = xTarget - robotPosition.x
|
||||
local yDistance = yTarget - robotPosition.y
|
||||
local zDistance = zTarget - robotPosition.z
|
||||
|
||||
if yDistance ~= 0 then
|
||||
local direction = yDistance > 0 and sides.up or sides.down
|
||||
for i = 1, math.abs(yDistance) do program.move(direction) end
|
||||
end
|
||||
|
||||
if xDistance ~= 0 then
|
||||
program.turnToRequiredRotation(xDistance > 0 and 0 or 2)
|
||||
for i = 1, math.abs(xDistance) do program.move(sides.front) end
|
||||
end
|
||||
|
||||
if zDistance ~= 0 then
|
||||
program.turnToRequiredRotation(zDistance > 0 and 1 or 3)
|
||||
for i = 1, math.abs(zDistance) do program.move(sides.front) end
|
||||
end
|
||||
|
||||
-- Если количество пустых слотов меньше, чем лимит пустых слотов,
|
||||
-- то выбрасываем весь дерьмовый шмот, указанный в массиве дерьмового шмота
|
||||
program.tryToDropShittyResources()
|
||||
|
||||
-- Если включена проверка энергосостояния, то делаем ее и возвращаемся на базу
|
||||
-- для подзарядки, если требуется
|
||||
if energyStatusCheckEnabled then program.checkEnergyStatus() end
|
||||
|
||||
-- Проверяем также состояние инструментов
|
||||
if toolStatusCheckEnabled then program.checkToolStatus() end
|
||||
|
||||
-- А еще заправляем генератор
|
||||
program.tryToRechargeByGenerator()
|
||||
end
|
||||
|
||||
function program.findNearestOre(ores)
|
||||
local nearest
|
||||
for i = 1, #ores do
|
||||
local distance = math.sqrt((ores[i].x - robotPosition.x) ^ 2 + (ores[i].y - robotPosition.y) ^ 2 + (ores[i].z - robotPosition.z) ^ 2)
|
||||
if not nearest or distance < nearest.distance then
|
||||
nearest = {x = ores[i].x, y = ores[i].y, z = ores[i].z, distance = distance, oreIndex = i}
|
||||
end
|
||||
end
|
||||
return nearest
|
||||
end
|
||||
|
||||
function program.scanAndDig(radius, passes, minHardness, maxHardness, bedrockLocation)
|
||||
local ores = program.scan(radius, passes, minHardness, maxHardness)
|
||||
print("Scanning finished, count of resources to mine: " .. #ores)
|
||||
while #ores > 0 do
|
||||
local nearest = program.findNearestOre(ores)
|
||||
if nearest.y >= bedrockLocation and nearest.y < 0 then
|
||||
-- print("Found next nearest ore: (" .. nearest.x .. "; " .. nearest.y .. "; " .. nearest.z .. ")")
|
||||
program.gotoPoint(nearest.x, nearest.y, nearest.z)
|
||||
end
|
||||
table.remove(ores, nearest.oreIndex)
|
||||
end
|
||||
end
|
||||
|
||||
function program.getBedrockLocation()
|
||||
while true do
|
||||
local success, reason = component.robot.swing(sides.down)
|
||||
if success or reason == "air" then
|
||||
program.move(sides.down)
|
||||
else
|
||||
if reason == "block" then
|
||||
print("Bedrock location is: " .. robotPosition.y)
|
||||
return robotPosition.y
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function program.getEmptySlotsCount()
|
||||
local count = 0
|
||||
for slot = 1, robot.inventorySize() do
|
||||
count = count + (robot.count(slot) == 0 and 1 or 0)
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
function program.tryToDropShittyResources()
|
||||
if program.getEmptySlotsCount() < dropShittyResourcesOnEmptySlots then
|
||||
print("Trying to drop all shitty resources to free some slots for mining")
|
||||
for slot = 1, robot.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
for i = 1, #shittyResources do
|
||||
if stack.name == shittyResources[i] then
|
||||
robot.select(slot)
|
||||
robot.drop()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if program.getEmptySlotsCount() < dropShittyResourcesOnEmptySlots - 2 then
|
||||
local oldPosition = {x = robotPosition.x, y = robotPosition.y, z = robotPosition.z, rotation = robotPosition.rotation}
|
||||
program.returnToBase()
|
||||
program.gotoPoint(oldPosition.x, oldPosition.y, oldPosition.z)
|
||||
program.turnToRequiredRotation(oldPosition.rotation)
|
||||
end
|
||||
|
||||
robot.select(1)
|
||||
end
|
||||
end
|
||||
|
||||
function program.dropAllResoucesIntoBaseChest()
|
||||
print("Dropping all mined resources to chest on base")
|
||||
for slot = 1, robot.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
if not string.match(stack.name, replaceToolRegex) then
|
||||
robot.select(slot)
|
||||
robot.drop()
|
||||
end
|
||||
end
|
||||
end
|
||||
robot.select(1)
|
||||
end
|
||||
|
||||
function program.checkToolStatus()
|
||||
if robot.durability() < replaceToolDurabilityTrigger then
|
||||
print("Equipped tool durability lesser then " .. replaceToolDurabilityTrigger)
|
||||
local success = false
|
||||
|
||||
for slot = 1, robot.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
if string.match(stack.name, replaceToolRegex) and stack.damage / stack.maxDamage < replaceToolDurabilityTrigger then
|
||||
local oldSlot = robot.select(slot)
|
||||
inventoryController.equip()
|
||||
robot.select(oldSlot)
|
||||
success = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not success and toolStatusCheckEnabled then
|
||||
toolStatusCheckEnabled = false
|
||||
returnToBase()
|
||||
print("No one useable tool are found in inventory, going back to base")
|
||||
os.exit()
|
||||
else
|
||||
print("Successfullty switched tool to another from inventory")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- getHardness(1, 0)
|
||||
-- program.checkToolStatus()
|
||||
-- program.move(sides.front)
|
||||
|
||||
-- Выбираем сразу первый слотик по умолчанию
|
||||
robot.select(1)
|
||||
-- Определяем позицию говна
|
||||
print("Going deeper to determine bedrock location...")
|
||||
local bedrockLocation = program.getBedrockLocation() + 4
|
||||
-- Ебошим стартовую точку после определения позиции говна, и если она слишком высоко, то робот начнет как раз от нее же
|
||||
local startPoint = bedrockLocation + 32
|
||||
if startPoint > 0 then startPoint = 0 end
|
||||
|
||||
-- Пиздуем на старт и вкалываем до посинения
|
||||
program.gotoPoint(0, startPoint, 0)
|
||||
program.scanAndDig(oreSearchRadius, searchPassesCount, minimumOreHardness, maximumOreHardness, bedrockLocation)
|
||||
|
||||
-- В конце возвращаемся на начало и ожидаем, че уж там
|
||||
program.returnToBase()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,61 +1,354 @@
|
||||
local robot = require("robot")
|
||||
|
||||
local computer = require("computer")
|
||||
local event = require("event")
|
||||
local sides = require("sides")
|
||||
local component = require("component")
|
||||
local inventory = component.inventory_controller
|
||||
|
||||
local robotComponent = component.robot
|
||||
local inventoryController = component.inventory_controller
|
||||
|
||||
local robotAPI = {}
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------------------------
|
||||
-------------------------------------------------- Some variables that user can change for himself --------------------------------------------------
|
||||
|
||||
local countOfTries = 20
|
||||
local sleepDelay = 0.06
|
||||
robotAPI.fuels = {
|
||||
"minecraft:coal",
|
||||
"minecraft:lava_bucket",
|
||||
"minecraft:coal_block",
|
||||
}
|
||||
|
||||
local itemsToDrop = {
|
||||
robotAPI.shittyResources = {
|
||||
"minecraft:cobblestone",
|
||||
"minecraft:grass",
|
||||
"minecraft:dirt",
|
||||
"minecraft:gravel",
|
||||
"minecraft:sand",
|
||||
"minecraft:sandstone",
|
||||
"minecraft:torch",
|
||||
"minecraft:planks",
|
||||
"minecraft:fence",
|
||||
"minecraft:chest",
|
||||
"minecraft:monster_egg",
|
||||
"minecraft:stonebrick",
|
||||
}
|
||||
|
||||
local directions = {
|
||||
up = { move = robot.up, swing = robot.swingUp},
|
||||
down = { move = robot.down, swing = robot.swingDown},
|
||||
forward = { move = robot.forward, swing = robot.swing},
|
||||
robotAPI.tools = {
|
||||
"minecraft:diamond_pickaxe",
|
||||
"minecraft:iron_pickaxe",
|
||||
}
|
||||
|
||||
function robotAPI.move(direction)
|
||||
local tries = 0
|
||||
while tries <= countOfTries do
|
||||
directions[direction].swing()
|
||||
local success, reason = directions[direction].move()
|
||||
os.sleep(sleepDelay)
|
||||
if success then
|
||||
return
|
||||
else
|
||||
print("Не могу двигаться " .. direction .. ": " .. reason)
|
||||
end
|
||||
tries = tries + 1
|
||||
end
|
||||
error("Количество попыток перемещения " .. direction .. " исчерпано, программа завершена")
|
||||
robotAPI.replaceToolOnDurabilityLesserThen = 0.05
|
||||
robotAPI.returnToHomeOnEneryLowerThen = 0.1
|
||||
robotAPI.dropShittyResourcesOnCountOfEmptySlotsLesserThen = 4
|
||||
|
||||
-------------------------------------------------- API-related stuff --------------------------------------------------
|
||||
|
||||
robotAPI.robotPosition = {x = 0, y = 0, z = 0, rotation = 0}
|
||||
|
||||
function robotAPI.getRobotPosition()
|
||||
return {
|
||||
x = robotAPI.robotPosition.x,
|
||||
y = robotAPI.robotPosition.y,
|
||||
z = robotAPI.robotPosition.z,
|
||||
rotation =robotAPI.robotPosition.rotation
|
||||
}
|
||||
end
|
||||
|
||||
function robotAPI.dropShmot()
|
||||
for slot = 1, robot.inventorySize() do
|
||||
local item = inventory.getStackInInternalSlot(slot)
|
||||
if item then
|
||||
for i = 1, #itemsToDrop do
|
||||
if item.name == itemsToDrop[i] then
|
||||
robot.select(slot)
|
||||
robot.drop()
|
||||
-------------------------------------------------- Move-related functions --------------------------------------------------
|
||||
|
||||
function robotAPI.returnToStartPoint()
|
||||
robotAPI.moveToRequiredPoint(0, robotAPI.robotPosition.y, 0)
|
||||
robotAPI.turnToRequiredRotation(0)
|
||||
robotAPI.tryToDropShittyResources()
|
||||
robotAPI.moveToRequiredPoint(0, 0, 0)
|
||||
end
|
||||
|
||||
function robotAPI.move(direction)
|
||||
while true do
|
||||
local swingSuccess, swingReason = robotComponent.swing(direction)
|
||||
if swingSuccess or swingReason == "air" then
|
||||
local moveSuccess, moveReason = robotComponent.move(direction)
|
||||
if moveSuccess then
|
||||
break
|
||||
end
|
||||
else
|
||||
if swingReason == "block" then
|
||||
robotAPI.returnToStartPoint()
|
||||
error("Unbreakable block detected, going to base")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if direction == sides.front or direction == sides.back then
|
||||
local directionOffset = direction == sides.front and 1 or -1
|
||||
|
||||
if robotAPI.robotPosition.rotation == 0 then
|
||||
robotAPI.robotPosition.x = robotAPI.robotPosition.x + directionOffset
|
||||
elseif robotAPI.robotPosition.rotation == 1 then
|
||||
robotAPI.robotPosition.z = robotAPI.robotPosition.z + directionOffset
|
||||
elseif robotAPI.robotPosition.rotation == 2 then
|
||||
robotAPI.robotPosition.x = robotAPI.robotPosition.x - directionOffset
|
||||
elseif robotAPI.robotPosition.rotation == 3 then
|
||||
robotAPI.robotPosition.z = robotAPI.robotPosition.z - directionOffset
|
||||
end
|
||||
elseif direction == sides.up or direction == sides.down then
|
||||
local directionOffset = direction == sides.up and 1 or -1
|
||||
robotAPI.robotPosition.y = robotAPI.robotPosition.y + directionOffset
|
||||
end
|
||||
end
|
||||
|
||||
function robotAPI.turn(clockwise)
|
||||
robotComponent.turn(clockwise)
|
||||
robotAPI.robotPosition.rotation = robotAPI.robotPosition.rotation + (clockwise and 1 or -1)
|
||||
if robotAPI.robotPosition.rotation > 3 then
|
||||
robotAPI.robotPosition.rotation = 0
|
||||
elseif robotAPI.robotPosition.rotation < 0 then
|
||||
robotAPI.robotPosition.rotation = 3
|
||||
end
|
||||
end
|
||||
|
||||
function robotAPI.turnToRequiredRotation(requiredRotation)
|
||||
local difference = robotAPI.robotPosition.rotation - requiredRotation
|
||||
|
||||
if difference ~= 0 then
|
||||
local fastestWay
|
||||
if difference > 0 then
|
||||
if difference > 2 then fastestWay = true else fastestWay = false end
|
||||
else
|
||||
if -difference > 2 then fastestWay = false else fastestWay = true end
|
||||
end
|
||||
|
||||
while robotAPI.robotPosition.rotation ~= requiredRotation do
|
||||
robotAPI.turn(fastestWay)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function robotAPI.moveToRequiredPoint(xTarget, yTarget, zTarget)
|
||||
local xDistance = xTarget - robotAPI.robotPosition.x
|
||||
local yDistance = yTarget - robotAPI.robotPosition.y
|
||||
local zDistance = zTarget - robotAPI.robotPosition.z
|
||||
|
||||
if yDistance ~= 0 then
|
||||
local direction = yDistance > 0 and sides.up or sides.down
|
||||
for i = 1, math.abs(yDistance) do robotAPI.move(direction) end
|
||||
end
|
||||
|
||||
if xDistance ~= 0 then
|
||||
robotAPI.turnToRequiredRotation(xDistance > 0 and 0 or 2)
|
||||
for i = 1, math.abs(xDistance) do robotAPI.move(sides.front) end
|
||||
end
|
||||
|
||||
if zDistance ~= 0 then
|
||||
robotAPI.turnToRequiredRotation(zDistance > 0 and 1 or 3)
|
||||
for i = 1, math.abs(zDistance) do robotAPI.move(sides.front) end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------- Inventory-related functions --------------------------------------------------
|
||||
|
||||
function robotAPI.getEmptySlotsCount()
|
||||
local count = 0
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
count = count + (robotComponent.count(slot) == 0 and 1 or 0)
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
function robotAPI.tryToDropShittyResources(side)
|
||||
if robotAPI.getEmptySlotsCount() < robotAPI.dropShittyResourcesOnCountOfEmptySlotsLesserThen then
|
||||
print("Trying to drop all shitty resources to free some slots for mining")
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
for i = 1, #robotAPI.shittyResources do
|
||||
if stack.name == robotAPI.shittyResources[i] then
|
||||
robotComponent.select(slot)
|
||||
robotComponent.drop(side or sides.down)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
robotComponent.select(1)
|
||||
end
|
||||
end
|
||||
|
||||
function robotAPI.dropAllResources(side, exceptArray)
|
||||
side = side or sides.front
|
||||
exceptArray = exceptArray or robotAPI.tools
|
||||
print("Dropping all mined resources...")
|
||||
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
local thisIsAShittyItem = true
|
||||
|
||||
for exceptItem = 1, #exceptArray do
|
||||
if stack.name == exceptArray[exceptItem] then
|
||||
thisIsAShittyItem = false
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if thisIsAShittyItem then
|
||||
robotComponent.select(slot)
|
||||
robotComponent.drop(side)
|
||||
end
|
||||
end
|
||||
end
|
||||
robotComponent.select(1)
|
||||
end
|
||||
|
||||
function robotAPI.checkToolStatus()
|
||||
if robotComponent.durability() < robotAPI.replaceToolOnDurabilityLesserThen then
|
||||
print("Equipped tool durability lesser then " .. robotAPI.replaceToolOnDurabilityLesserThen)
|
||||
local success = false
|
||||
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
for tool = 1, #robotAPI.tools do
|
||||
if stack.name == robotAPI.tools[tool] and stack.damage / stack.maxDamage < robotAPI.replaceToolOnDurabilityLesserThen then
|
||||
local oldSlot = robotComponent.select()
|
||||
robotComponent.select(slot)
|
||||
inventoryController.equip()
|
||||
robotComponent.select(oldSlot)
|
||||
success = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not success then
|
||||
robotAPI.returnToStartPoint()
|
||||
error("No one useable tool are found in inventory, going back to base")
|
||||
else
|
||||
print("Successfullty switched tool to another from inventory")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------- Energy-related functions --------------------------------------------------
|
||||
|
||||
function robotAPI.checkEnergyStatus()
|
||||
if computer.energy() / computer.maxEnergy() < robotAPI.returnToHomeOnEneryLowerThen then
|
||||
print("Low energy level detected")
|
||||
-- Запоминаем старую позицию, шобы суда вернуться
|
||||
local oldPosition = robotAPI.getRobotPosition()
|
||||
-- Пиздуем на базу за зарядкой
|
||||
robotAPI.returnToStartPoint()
|
||||
-- Заряжаемся, пока энергия не достигнет более-менее максимума
|
||||
while computer.energy() / computer.maxEnergy() < 0.99 do
|
||||
print("Charging up: " .. math.floor(computer.energy() / computer.maxEnergy() * 100) .. "%")
|
||||
os.sleep(1)
|
||||
end
|
||||
-- Пиздуем обратно
|
||||
robotAPI.moveToRequiredPoint(oldPosition.x, oldPosition.y, oldPosition.z)
|
||||
robotAPI.turnToRequiredRotation(oldPosition.rotation)
|
||||
end
|
||||
end
|
||||
|
||||
function robotAPI.getSlotWithFuel()
|
||||
for slot = 1, robotComponent.inventorySize() do
|
||||
local stack = inventoryController.getStackInInternalSlot(slot)
|
||||
if stack then
|
||||
for fuel = 1, #robotAPI.fuels do
|
||||
if stack.name == robotAPI.fuels[fuel] then
|
||||
return slot
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
robot.select(1)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------------------------------------------------------------------
|
||||
function robotAPI.checkGeneratorStatus()
|
||||
if component.isAvailable("generator") then
|
||||
if component.generator.count() == 0 then
|
||||
print("Generator is empty, trying to find some fuel in inventory")
|
||||
local slot = robotAPI.getSlotWithFuel()
|
||||
if slot then
|
||||
print("Found slot with fuel: " .. slot)
|
||||
local oldSlot = robotComponent.select()
|
||||
robotComponent.select(slot)
|
||||
component.generator.insert()
|
||||
robotComponent.select(oldSlot)
|
||||
return
|
||||
else
|
||||
print("Slot with fuel not found")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------- Shortcut functions --------------------------------------------------
|
||||
|
||||
-- Swing
|
||||
function robotAPI.swingForward()
|
||||
return robotComponent.swing(sides.front)
|
||||
end
|
||||
|
||||
function robotAPI.swingUp()
|
||||
return robotComponent.swing(sides.up)
|
||||
end
|
||||
|
||||
function robotAPI.swingDown()
|
||||
return robotComponent.swing(sides.down)
|
||||
end
|
||||
|
||||
--Use
|
||||
function robotAPI.useForward()
|
||||
return robotComponent.use(sides.front)
|
||||
end
|
||||
|
||||
function robotAPI.useUp()
|
||||
return robotComponent.use(sides.up)
|
||||
end
|
||||
|
||||
function robotAPI.useDown()
|
||||
return robotComponent.use(sides.down)
|
||||
end
|
||||
|
||||
-- Move
|
||||
function robotAPI.moveForward()
|
||||
robotAPI.move(sides.front)
|
||||
end
|
||||
|
||||
function robotAPI.moveBack()
|
||||
robotAPI.move(sides.back)
|
||||
end
|
||||
|
||||
function robotAPI.moveUp()
|
||||
robotAPI.move(sides.up)
|
||||
end
|
||||
|
||||
function robotAPI.moveDown()
|
||||
robotAPI.move(sides.down)
|
||||
end
|
||||
|
||||
-- Turn
|
||||
function robotAPI.turnLeft()
|
||||
robotAPI.turn(false)
|
||||
end
|
||||
|
||||
function robotAPI.turnRight()
|
||||
robotAPI.turn(true)
|
||||
end
|
||||
|
||||
function robotAPI.turnAround()
|
||||
robotAPI.turn(true)
|
||||
robotAPI.turn(true)
|
||||
end
|
||||
|
||||
-------------------------------------------------- End of shit --------------------------------------------------
|
||||
|
||||
return robotAPI
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user