Advertisement
aka_zaratustra

fixit

Dec 28th, 2022 (edited)
1,280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 32.79 KB | None | 0 0
  1. --Скрипт для робота, для ремонта многоблоков по всей базе
  2. --Автор: aka_zaratustra зима 2022
  3. local ver = "1.1.1" -- версия программы
  4. --Историю версий см. в конце файла
  5.  
  6. --Что делает этот робот?
  7.     --Робот отрабатывает роль дежурного по ремонту многоблоков на вашей базе.
  8.     --Робот находится на своей парковочной станции и периодически совершает обходы по базе
  9.     --В обходе робот следует по маршруту, в котором точками остановки являются многоблоки внесенные в маршрутный лист робота, а точнее мэйнтененс блоки многоблоков.
  10.     --Робот ремонтирует многоблок через мейнтененс с помощью изоленты и отправляется к следующей точке маршрута, когда все точки маршрута пройдены, робот возвращается на парковочную станцию
  11.  
  12. --Как начать работать с роботом?
  13.     --Скачаваем программу на робота и помещаем имя ее файла в автозапуск (в файл /home/.shrc нужно добавить имя программы: "fixit.lua" без кавычек)
  14.     --Ставим робота на парковочную станцию - любое место на вашей базе на уровне пола рядом с блоком зарядки (charger) так, чтобы робот смотрел в зарядку лицом. Включаем робота. Он загружается, видит перед собой зарядку, понимает, что он на парковочной станции и запоминает место, где она находится.
  15.     --Снимаем робота и несем его к многоблоку, который мы хотим, чтобы робот ремонтировал. Ставим робота рядом с мэйнтененс хэтчем так, чтобы робот смотрел в него лицом. Включаем его. Он загружается, видит перед собой мэйнтененс хэтч, понимает, что он рядом с многоблоком, который мы хотим внести в его маршрутный лист, добавляет этот мэйнтененс в свой маршрутный лист, ремонтирует его и уезжает на парковочную станцию. Повторяем это для каждого мультиблока, который должен ремонтировать робот.
  16.     --Далее робот сам будет периодически отправляться по маршруту и ремонтировать мультиблоки из своего маршрутного листа.
  17.  
  18. --Требования к геометрии зоны обслуживания - той части базы, где будет дежурить робот ремонтник
  19.     --Пол зоны обслуживания должен быть весь на одном уровне, без ступенек и перепадов высот.
  20.     --Зона обслуживания должна образовывать прямоугольник из чанков. Количество чанков может быть любым по длине и ширине, но важно чтобы это был прямоугольник.
  21.     --Все чанки зоны обслуживания должны иметь свободные каря-дорожки: Крайний ряд блоков по всему периметру каждого чанка должен быть свободным. Он используются как дорожки для следования робота.
  22.     --Пример вашей базы:    
  23.     --ХХХХХХХ
  24.     --ХХХХХХХ
  25.     --ХХХХХХХ
  26.     --ХХХХХХХ
  27.     --, где X - чанк вашей базы. У каждого чанка Х должны быть свободные дорожки по краям.
  28.     --Расположение мэйнтененса в многоблоке должно быть таким, чтобы мейнтененс смотрел интерфейсной стороной на край чанка. Оттуда будет заезжать робот. Прямой путь от края чанка до мейнтененса должен быть свободен. Мейнтенес должен быть выше пола (на любое количество блоков).
  29.    
  30. --Как добавлять мейнтененсы в маршрут робота:
  31.     --Поставить робота лицом к мейнтененсу и включить.
  32. --Как удалять мейтененсы из маршрута робота. Варианты:
  33.     -- 1) Удалить многоблок. Робот приедет осуществлять ремонт, увидит, что мейнтененса нет и вычеркнет его из своего списка.
  34.     -- 2) Поставить робота лицом к мейнтененсу, удалить(сбить) мейнтененс, после чего включить робота. Включившись, робот узнает эту точку, т.к. она у него есть в маршруте, увидит, что мейнтененса на ней больше нет и удалит этот мейнтененс из своего маршрута.
  35.     -- 3) Отредактировать в ручную файл /home/route_data.lua - файл, в котором робот хранит точки своего маршрута.
  36. --Как сообщить роботу, что я переставил зарядку (Charger). Варианты:
  37.     -- 1) Поставить робота рядом с новым местом зарядки (Charger) и включить. Он забудет старое место и запомнит новое.
  38.     -- 2) Отредактировать в ручную файл /home/park_data.lua - файл, в котором робот хранит координаты парковочной станции.
  39.  
  40. --Требуемый состав компонентов робота:
  41.     --Screen T1
  42.     --Keyboard
  43.     --Inventory Controller Upgrade
  44.     --Inventory Upgrade
  45.     --Geolyzer
  46.     --Navigation Upgrade*
  47.     --Internet Card (не обязательно)
  48.     --Graphic Card
  49.     --CPU
  50.     --Memory
  51.     --Memory
  52.     --EEPROM (Lua Bios
  53.     --Hard Disk Drive
  54.    
  55.     --* - Navigation Upgrade нужно крафтить с картой, НА КОТОРОЙ ПОМЕЩАЕТСЯ ЗОНА ОБСЛУЖИВАНИЯ ЦЕЛИКОМ! Ваш робот сможет ездить только в том куске мира, который влезет в эту долбаную карту! Почему долбанную? Посмотрите мой стрим (ссылка позже будет тут) или гайд (если я его записал)
  56.    
  57. --Длина сна между дежурными обходами робота в секундах
  58. local DutyPeriod = 86400 --сутки
  59.    
  60. local robot = require("robot")
  61. local computer = require("computer")
  62. local component = require("component")
  63. local term = require("term")
  64. local shell = require("shell")
  65. local sides = require("sides")
  66. local colors = require("colors")
  67. local filesystem = require("filesystem")
  68. local geo = component.geolyzer
  69. local navigation = component.navigation
  70. local inventory = component.inventory_controller
  71.  
  72.  
  73. local RouteListFileName = "route_data" --файл с маршрутом точек ремонта робота ремонтника
  74. local ParkStationFileName = "park_data" --файл с координатами парковочной станции
  75.  
  76. --Таблица маршрута точек ремонта
  77. local RouteListTable = {
  78.     --m - признак посещения
  79.     --x, y, z - координаты точки ремонта
  80.     --f - направление лицевой части робота в точке ремонта
  81.    
  82.     --пример точек
  83.     --{ m = 1, x = 110, y = 65 , z = 210, f = 1},
  84.     --{ m = 2, x = 120, y = 65 , z = 220, f = 2},
  85.     --{ m = 3, x = 130, y = 65 , z = 230, f = 3},
  86.     --{ m = 4, x = 140, y = 65 , z = 240, f = 4},
  87. }
  88.  
  89. --координаты станции парковки
  90. local ParkStation = {
  91.     x = 0, y = 0 , z = 0, f = 0
  92. }
  93.  
  94. function debugPrintTable(t)
  95.     print("Таблица:")
  96.     for name, val in pairs(t) do --просмотрим таблицу
  97.         print(name, val)
  98.         os.sleep(0.5)
  99.     end
  100.     os.exit()
  101. end
  102.  
  103. function blockNameInfrontOfRobot() --возвращает имя блока перед роботом
  104.     analyze_result = geo.analyze(3) --анализируем блок перед роботом
  105.     --term.write(analyze_result)
  106.     --########################ДЛЯ ДЭБАГА
  107.     -- for name, val in pairs(analyze_result) do --просмотрим таблицу
  108.         -- print(name, val)
  109.         -- os.sleep(0.5)
  110.         -- if name == "sensorInformation" then
  111.             -- print("было")
  112.             -- for name2, val2 in pairs(val) do --просмотрим таблицу
  113.                 -- print(name2, val2)
  114.             -- end
  115.         -- end
  116.     -- end
  117.     -- os.exit()
  118.     --########################
  119.  
  120.     for name, val in pairs(analyze_result) do --просмотрим таблицу скана
  121.         if name == "name" then
  122.             return val
  123.         end
  124.     end
  125. end
  126.  
  127.  
  128. function createRouteListTableText() --возвращает таблицу маршрута точек ремонта в виде текста
  129.     local code = ""
  130.  
  131.     code = code .. "\n-- Файл с маршрутом точек ремонта робота ремонтника"
  132.     code = code .. "\n"
  133.     code = code .. "\nlocal RouteListTable = {"
  134.  
  135.     for pointIndex, point in pairs(RouteListTable) do
  136.         code = code .. "\n  { m = " .. point.m .. ', x = ' .. point.x .. ', y = ' .. point.y .. ', z = ' .. point.z .. ', f = ' .. point.f .. '},'
  137.     end
  138.     code = code .. "\n}"
  139.     code = code .. "\n\nreturn RouteListTable"
  140.  
  141.     return code
  142. end
  143. function createParkStationText() --возвращает координаты станции парковки в виде текста
  144.     local code = ""
  145.  
  146.     code = code .. "\n-- Файл с координатами парковочной станции"
  147.     code = code .. "\n"
  148.     code = code .. "\nlocal ParkStation = {"
  149.  
  150.     code = code .. "\n  x = " .. ParkStation.x .. ', y = ' .. ParkStation.y .. ', z = ' .. ParkStation.z .. ', f = ' .. ParkStation.f
  151.     code = code .. "\n}"
  152.     code = code .. "\n\nreturn ParkStation"
  153.  
  154.     return code
  155. end
  156.  
  157. function SaveCodeToFile(code, filename) --сохранить текст в файл
  158.     local file = io.open(filename .. ".lua", "w")
  159.     file:write(code)
  160.     file:close()
  161. end
  162.  
  163. function getRobotPositionXYZF()
  164.         local currentX, currentY, currentZ = navigation.getPosition()
  165.         if currentX == nil then
  166.             term.write("Я нахожусь в месте, которое лежит за пределами \nмоей карты, которую вы использовали для крафта \nмоего Navigation Upgrade, поэтому не могу \nопределить свое местоположение. \nДля работы мне необходимо находиться в пределах\n моей карты.")
  167.             os.exit()
  168.         end
  169.         --Убираем дробную часть координат
  170.         currentX = currentX - 0.5
  171.         currentY = currentY - 0.5
  172.         currentZ = currentZ - 0.5
  173.         local currentF = navigation.getFacing()
  174.         return currentX, currentY, currentZ, currentF
  175. end
  176.  
  177. function init() --инициализация программы
  178.     --Робот включился.
  179.     term.clear()
  180.     term.write("--------------------------------------------------")
  181.     term.write("Скрипт для робота, \nдля ремонта многоблоков по всей базе\n")
  182.     term.write("Версия: "..ver.."\n")
  183.     term.write("--------------------------------------------------\n")
  184.     --Проверим, что стоит перед роботом.
  185.     blockName = blockNameInfrontOfRobot()
  186.     --В зависимости от того, перед каким блоком был включен робот, запоминаем этот блок либо как нашу парковочнку станцию, либо как точку маршрута
  187.     if blockName == "gregtech:gt.blockmachines" then --Если грег блок, значит это мэйнтененс, нужно добавить его в маршрут обхода
  188.         --перед нами блок грега, занчит считаем что перед нами мэйнтененс
  189.         term.write("Вижу перед собой мейнтененс (блок грега).\n")
  190.        
  191.         --добавляем его в маршрутный лист, но сперва проверим, может быть он уже там есть
  192.         --загрузим таблицу маршрута точек ремонта из файла
  193.         if filesystem.exists(shell.resolve(RouteListFileName..".lua")) == true then
  194.             RouteListTable = require (RouteListFileName)
  195.         end
  196.        
  197.         --проверим, может быть эта точка уже есть в таблице
  198.         local currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  199.        
  200.         --цикл по таблице точек ремонта
  201.         local founded = false
  202.         for name, val in pairs(RouteListTable) do --просмотрим таблицу
  203.             --term.write(val.x, val.y, val.z, val.f)
  204.             if currentX == val.x and currentY == val.y and currentZ == val.z and currentF == val.f then
  205.                 founded = true
  206.                 break
  207.             end
  208.         end
  209.         if founded == true then
  210.             term.write("Точка, в которой я сейчас нахожусь, уже есть \nв моем маршруте.\n")
  211.         else
  212.             local line = { m = -1, x = currentX, y = currentY, z = currentZ, f = currentF}
  213.             table.insert(RouteListTable, line)
  214.             SaveCodeToFile(createRouteListTableText(), RouteListFileName)
  215.             term.write("**************************************************")
  216.             term.write("Я ДОБАВИЛ ТОЧКУ, НА КОТОРОЙ Я СЕЙЧАС НАХОЖУСЬ, \nВ СВОЙ МАРШРУТ ОБХОДА.\n")
  217.             term.write("**************************************************")
  218.             --подождем 5 сек оставаясь неподвижным, на случай, если хозяин захочет сбить робота и отнести в другое место
  219.             term.write("Жду 5 секунд...")
  220.             robot.setLightColor(0x00CC00)
  221.             os.sleep(5)
  222.             robot.setLightColor(0xCC0000)
  223.             term.clearLine()
  224.         end
  225.        
  226.        
  227.     elseif blockName == "OpenComputers:charger" then --Если это Charger, значит мы перед нашей новой станцией парковки. Нужно обновить координаты станции парковки.
  228.         --робот загрузился и видит перед собой Charger
  229.         term.write("Вижу перед собой чарджер.\n")
  230.  
  231.         --проверяем, не поменялись ли координаты станции парковки
  232.         --загрузим координаты парковки из файла
  233.         if filesystem.exists(shell.resolve(ParkStationFileName..".lua")) == true then
  234.             ParkStation = require (ParkStationFileName)
  235.         end
  236.         --сравним их
  237.         local currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  238.         if currentX ~= ParkStation.x or currentY ~= ParkStation.y or currentZ ~= ParkStation.z or currentF ~= ParkStation.f then
  239.             --положение чарджера поменялось. нужно обновить координаты
  240.             term.write("Значит это мое новое парковочное место!\n")
  241.             ParkStation.x = currentX
  242.             ParkStation.y = currentY
  243.             ParkStation.z = currentZ
  244.             ParkStation.f = currentF
  245.             SaveCodeToFile(createParkStationText(), ParkStationFileName)
  246.             term.write("Я запомнил его.\n")
  247.         else
  248.             term.write("Это моё привычное парковочное место, я помню его!\n")
  249.         end
  250.        
  251.        
  252.     else --если перед нами непонятно что
  253.         term.write("Не вижу перед собой ни чаржера, ни мейнтененса.\n")
  254.     end
  255.  
  256.     --попробуем загрузить данные из файлов
  257.  
  258.     --загрузим координаты парковки из файла
  259.     if filesystem.exists(shell.resolve(ParkStationFileName..".lua")) == true then
  260.         ParkStation = require (ParkStationFileName)
  261.     else
  262.         term.write("Я не помню своего места парковки! \nПоставьте меня перед чаржером и запустите.\n")
  263.         os.exit()
  264.     end
  265.  
  266.     --загрузим таблицу маршрута точек ремонта из файла
  267.     if filesystem.exists(shell.resolve(RouteListFileName..".lua")) == true then
  268.         RouteListTable = require (RouteListFileName)
  269.     end
  270.     local size1 = 0
  271.     for _ in pairs(RouteListTable) do size1 = size1 + 1 end
  272.     if size1 == 0 then
  273.         term.write("Я помню своё место парковки. \nНо мой маршрутный лист пуст! \nПоставьте меня перед мейнтенесом и запустите.\n")
  274.         os.exit()
  275.     end
  276. end    
  277.  
  278. function MakeADutyRound() --совершить обход по маршруту
  279.    
  280.     function calcChunkCoordinates(x, z) --вычисляем координаты текущего чанка
  281.         local ChunkX = math.floor(x / 16) * 16
  282.         local ChunkZ = math.floor(z / 16) * 16
  283.         return ChunkX, ChunkZ
  284.     end
  285.     function robotAlignTo(d) --выровнять нос робота на заданную сторону света; d - заданная сторона света
  286.    
  287.         currentX, currentY, currentZ, F =  getRobotPositionXYZF()
  288.  
  289.         if d == F then return end
  290.         if (d == sides.north and F == sides.west) or
  291.             (d == sides.west and F == sides.south) or
  292.             (d == sides.south and F == sides.east) or
  293.             (d == sides.east and F == sides.north) then
  294.                 robot.turnRight()
  295.                 return
  296.         elseif (F == sides.north and d == sides.west) or
  297.             (F == sides.west and d == sides.south) or
  298.             (F == sides.south and d == sides.east) or
  299.             (F == sides.east and d == sides.north) then
  300.                 robot.turnLeft()
  301.                 return
  302.         else
  303.             robot.turnAround()
  304.             return
  305.         end
  306.     end
  307.     function makeATrip(destX, destY, destZ, destF) --совершить поездку до указанной точки
  308.         local destChunkX, destChunkZ
  309.         term.write("Следую к: х = " .. destX .." y = " .. destY .." z = " .. destZ .. "...")
  310.        
  311.         --следование до точки проходит в три этапа: 1 - до края чанка, 2 - по границам чанка до нужного чанка, 3 - от границы чанка до конечной точки
  312.         --Этап 1 - следуем до края чанка
  313.         --print("Выбираюсь к кромке чанка...")
  314.        
  315.        
  316.         --для этого мы должны развернуться в сторону ближайшей дорожки чанка
  317.        
  318.         --текущие координаты робота
  319.         local currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  320.  
  321.         --опустимся на пол
  322.         while currentY ~= ParkStation.y do
  323.             robot.down()
  324.             currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  325.         end
  326.  
  327.         --текущий чанк робота
  328.         local currentChunkX, currentChunkZ = calcChunkCoordinates(currentX, currentZ)
  329.        
  330.         --координаты робота в чанке  
  331.         --local curX_inChank = currentX - currentChunkX
  332.         --local curZ_inChank = currentZ - currentChunkZ
  333.        
  334.         --исходя из требования к геометрии зоны обслуживания, робот стоит спиной к той границе чанка, проезд до которой свободен
  335.         --разворачиваем робота на 180 градусов и едем к границе чанка
  336.         robot.turnAround()
  337.         --цикл пока не доехали до границы чанка
  338.         while currentX ~= currentChunkX and currentZ ~= currentChunkZ and currentX ~= currentChunkX+16 and currentZ ~= currentChunkZ+16 do
  339.             robot.forward()
  340.             currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  341.             --print(currentX, currentChunkX, currentZ, currentChunkZ)
  342.         end
  343.        
  344.         --Этап 2 следуем до чанка, в котором находится точка назначения
  345.         --print("Следую до чанка, в котором находится точка \nназначения...")
  346.        
  347.         destChunkX, destChunkZ = calcChunkCoordinates(destX, destZ)
  348.            
  349.         --проверим, точно ли точка назначения находится в другом, а не в этом чанке
  350.         if currentChunkX ~= destChunkX or currentChunkZ ~= destChunkZ then
  351.        
  352.             while currentChunkX ~= destChunkX or currentChunkZ ~= destChunkZ do
  353.                 --производим движение по X пока не приедем в нужный чанк, при этом мы уже должны быть на границе чанка по Z (т.е. находится на кромке чанка)
  354.                 --print (currentZ, math.floor(currentZ / 16) * 16)
  355.                 while currentX ~= destChunkX  and currentZ == math.floor(currentZ / 16) * 16 do
  356.                     --выровняем нос робота
  357.                     if currentX < destChunkX then
  358.                         robotAlignTo(sides.east)
  359.                     else
  360.                         robotAlignTo(sides.west)
  361.                     end
  362.                     robot.forward()
  363.                     currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  364.                     currentChunkX, currentChunkZ = calcChunkCoordinates(currentX, currentZ)
  365.                    
  366.                 end
  367.                 --производим движение по Z пока не приедем в нужный чанк, при этом мы уже должны быть на границе чанка по X (т.е. находится на кромке чанка)
  368.                 --print (currentX, math.floor(currentX / 16) * 16)
  369.                 while currentZ ~= destChunkZ  and currentX == math.floor(currentX / 16) * 16 do
  370.                     --выровняем нос робота
  371.                     if currentZ < destChunkZ then
  372.                         robotAlignTo(sides.south)
  373.                     else
  374.                         robotAlignTo(sides.north)
  375.                     end
  376.                     robot.forward()
  377.                     currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  378.                     currentChunkX, currentChunkZ = calcChunkCoordinates(currentX, currentZ)
  379.                    
  380.                 end
  381.  
  382.             end
  383.         end
  384.        
  385.         --Этап 3 Следую к месту кромки чанка, с которого я заеду на точки назначения внутри чанка
  386.         --print("Следую к месту кромки чанка, с которого я заеду \nна точку назначения внутри чанка...")
  387.         --вычислим координаты точки заезда
  388.         local getinX
  389.         local getinZ
  390.         if destF == sides.north then
  391.             getinX = destX
  392.             getinZ = destChunkZ + 15
  393.         elseif destF == sides.south then
  394.             getinX = destX
  395.             getinZ = destChunkZ
  396.         elseif destF == sides.west then
  397.             getinX = destChunkX+15
  398.             getinZ = destZ
  399.         else --destF == sides.east then
  400.             getinX = destChunkX
  401.             getinZ = destZ
  402.         end
  403.        
  404.         --отправляемся к точке заезда
  405.        
  406.         while currentX ~= getinX or currentZ ~= getinZ do
  407.             --производим движение по X
  408.             while currentX ~= getinX and ((currentZ == getinZ) or (destF == sides.west) or (destF == sides.east)) do
  409.                
  410.                 --выровняем нос робота
  411.                 if currentX < getinX then
  412.                     robotAlignTo(sides.east)
  413.                 else
  414.                     robotAlignTo(sides.west)
  415.                 end
  416.                 robot.forward()
  417.                 currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  418.             end
  419.             --производим движение по Z
  420.             while currentZ ~= getinZ and ((currentX == getinX) or (destF == sides.north) or (destF == sides.south)) do
  421.                
  422.                 --выровняем нос робота
  423.                 if currentZ < getinZ then
  424.                     robotAlignTo(sides.south)
  425.                 else
  426.                     robotAlignTo(sides.north)
  427.                 end
  428.                 robot.forward()
  429.                 currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  430.             end
  431.  
  432.         end    
  433.        
  434.         --Этап 4 - следуем до точки назначения внутри чанка
  435.         --print("Вхожу в чанк и следую до точки назначения внутри \nчанка...")
  436.         robotAlignTo(destF) --повернем робота к точке назначения
  437.         while currentX ~= destX or currentZ ~= destZ do
  438.             robot.forward()
  439.             currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  440.         end
  441.         --поднимаемся к мейнтененсу
  442.         while currentY ~= destY do
  443.             robot.up()
  444.             currentX, currentY, currentZ, currentF =  getRobotPositionXYZF()
  445.         end
  446.         print(" Ok")
  447.     end
  448.     function checkTapeinInventory() --проверяет наличие ремонтного материла в инвентори робота, и если его нет, а робот находится на базе, то пытается взять из сундука
  449.         function findTapeInInnerInventory() --возвращает номер слота и количество изоленты
  450.             local tapeSlot = -1
  451.             local tapeCount = 0
  452.             for i=1, math.floor(robot.inventorySize()) do --пройдемся по инвентори робота
  453.                 local item = inventory.getStackInInternalSlot(i)
  454.                 if item ~= nil then
  455.                     --print (item.name, item.damage)
  456.                     if item.name == "gregtech:gt.metaitem.01" and item.damage == 32764 then --изолента
  457.                         tapeSlot = i -- запомним слот, в котором лежит изолента
  458.                         return tapeSlot, item.size
  459.                     end
  460.                 end
  461.             end
  462.             return -1, 0
  463.         end
  464.         --проверим, есть ли в роботе ремонтные принадлежности
  465.         term.write("Проверяю, есть ли у меня изолента...")
  466.         local tapeSlot, size = findTapeInInnerInventory()
  467.         if tapeSlot == -1 then
  468.             -- в инвентори не нашли, но может есть на поясе?
  469.             inventory.equip() --возвращаем принадлежность во внутреннюю инвентори
  470.             tapeSlot, size = findTapeInInnerInventory()
  471.             if tapeSlot == -1 then
  472.                 print(" Не найдено!");
  473.                 --попробуем взять из сундука под роботом
  474.                 --проверим, находимся ли мы на парковке
  475.                 curX, curY, curZ, curF = getRobotPositionXYZF()
  476.                 if curX == ParkStation.x and curY == ParkStation.y and curZ == ParkStation.z and curF == ParkStation.f then
  477.                     term.write("Пытаюсь взять изоленту из сундука под моим местом\nпарковки...")
  478.                    
  479.                    
  480.                     local chestSize = inventory.getInventorySize(sides.down)
  481.                     if chestSize == nil then --если под роботом на парковке нет сундука, а раз мы здесь, то и в роботе нет ремонтных принадлежностей, то конец работы
  482.                         print(" Сундук не найден!")
  483.                         os.exit()
  484.                     end
  485.                     if robot.suckDown() == false then
  486.                         print(" В сундуке ничего нет!")
  487.                         os.exit()
  488.                     else
  489.                         --проверим что мы взяли
  490.                         tapeSlot, size = findTapeInInnerInventory()
  491.                         if tapeSlot == -1 then
  492.                             print(" В сундуке оказался неподходящий \nпредмет!")
  493.                             os.exit()
  494.                         end
  495.                     end
  496.                 else
  497.                     return false
  498.                 end
  499.             end
  500.         end
  501.        
  502.         print(" Ok")       
  503.         return true
  504.     end
  505.     function returnToBaseToReplenishSupplies() --вернутся на базу за ремонтными принадлежностями
  506.         print("Возвращаюсь на станцию парковки за изолентой.");
  507.         makeATrip(ParkStation.x, ParkStation.y, ParkStation.z, ParkStation.f)
  508.         if checkTapeinInventory() == false then
  509.             print("\nНе могу отправиться на ремонт без материала! \nНа моей станции парковки под моим местом парковки\nдолжен быть сундук или бочка с ремонтным \nматериалом (изолентой).")
  510.             os.exit()
  511.         end
  512.     end
  513.  
  514.     --перед поездкой проверим ремонтные принадлежности (изолента)
  515.     if checkTapeinInventory() == false then
  516.         --если нет у нас изоленты, съездим за ней на базу
  517.         returnToBaseToReplenishSupplies()
  518.     end
  519.     --посетим все точки в маршруте
  520.     print("НАЧИНАЮ ОБХОД ВСЕХ ТОЧЕК РЕМОНТА.");
  521.     for name, val in pairs(RouteListTable) do
  522.  
  523.        
  524.         --совершим поездку до очередной точки ремонта
  525.         makeATrip(RouteListTable[name].x, RouteListTable[name].y, RouteListTable[name].z, RouteListTable[name].f)
  526.        
  527.         --Прибыли на точку. Проверим есть ли там то, зачем мы прибыли
  528.         blockName = blockNameInfrontOfRobot()
  529.         if blockName ~= "gregtech:gt.blockmachines" then
  530.             print("Прибыв на точку не обнаружил там мейнтененс! \nУдаляю эту точку из маршрута.");
  531.             RouteListTable[name] = nil
  532.             --сохраним на диск
  533.             SaveCodeToFile(createRouteListTableText(), RouteListFileName)
  534.            
  535.         else --осуществляем ремонт
  536.             --проверим изоленту в инвентори
  537.             if checkTapeinInventory() == false then
  538.                 print("Не могу осуществить ремонт!")
  539.                 returnToBaseToReplenishSupplies() --вернемся на парковочную станцию для пополнения запаса ремонтных принадлежностей (изоленты)
  540.                 --После того как пополнили запасы изоленты, вернемся на точку ремонта
  541.                 print("Возвращаюся к точке закончить ремонт.")
  542.                 makeATrip(RouteListTable[name].x, RouteListTable[name].y, RouteListTable[name].z, RouteListTable[name].f)
  543.             end
  544.             term.write("Осуществляю ремонт...");
  545.             inventory.equip() --берем принадлежность в руки
  546.             robot.use(sides.back)
  547.             inventory.equip() --возвращаем принадлежность во внутреннюю инвентори
  548.             print(" Ok")
  549.         end
  550.        
  551.        
  552.     end
  553.    
  554.     --вернемся на станцию парковки
  555.    
  556.     print("ОБХОД ЗАВЕРШЕН. Возвращаюсь на станцию парковки.");
  557.     makeATrip(ParkStation.x, ParkStation.y, ParkStation.z, ParkStation.f)
  558.     --проверим, есть ли там чарджер
  559.    
  560.    
  561. end
  562.  
  563. --ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ
  564. init() --инициализируем робота
  565. while true do
  566.     --Оправляемся на обход
  567.     MakeADutyRound()
  568.    
  569.     --после обхода проверим, остались ли точки ремонта в таблице
  570.     local ListHasPoints = false
  571.     for name, val in pairs(RouteListTable) do
  572.         if val ~= nil then
  573.             ListHasPoints = true
  574.             break
  575.         end
  576.     end
  577.     if ListHasPoints == false then
  578.         print("В моем списке не осталось ни одной точки ремонта!")
  579.         print("Поставьте меня перед мейнтенесом и запустите.")
  580.         os.exit()
  581.     end
  582.    
  583.     --Спим до следующего обхода
  584.     term.write("Ожидаю следующего обхода.\n");
  585.     RemainTimer = DutyPeriod
  586.     while RemainTimer > 0 do
  587.         term.clearLine()
  588.         term.write("Осталось секунд... "..RemainTimer)
  589.         RemainTimer = RemainTimer - 5
  590.         os.sleep(5)
  591.     end
  592.     term.clearLine()
  593.  
  594. end
  595.  
  596. --История версий:
  597.  
  598. --Версия 1.1
  599. --Добавлено 5ти секундное неподвижное ожидание роботом после занесения новой точки в маршрут робота, для удобства сбивания робота на случай, если владелец робота намеревается после регистрации новой точки снять и отнести робота в другое место
  600.  
  601.  
  602. --todo
  603. --изоленту в роботе проверять во всех слотах
  604. --приезжая на базу проверять наличие чарджера
  605. --при пробуждении перед пустым блоком, в котором раньше был мейнтененс, удалять точку маршрута из таблицы
  606.  
  607.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement