Advertisement
gnidmoo

empowerer.lua

Dec 14th, 2019 (edited)
490
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.84 KB | None | 0 0
  1. -- Made by Unarelith
  2. -- https://github.com/Unarelith
  3.  
  4. local robot_api = require("robot")
  5. local component = require("component")
  6. local sides = require("sides")
  7. local term = require("term")
  8.  
  9. local Recipes = {
  10.     ["Empowered Emeradic Crystal Block"] = {
  11.         "Emeradic Crystal Block",
  12.         "Emerald",
  13.         "Beryllium Dust",
  14.         "Cactus Green",
  15.         "Ethetic Green Block"
  16.     },
  17.     ["Empowered Void Crystal Block"] = {
  18.         "Void Crystal Block",
  19.         "Block of Black Quartz",
  20.         "Basalt",
  21.         "Block of Black Iron",
  22.         "Ink Sac"
  23.     },
  24.     ["Empowered Restonia Crystal Block"] = {
  25.         "Restonia Crystal Block",
  26.         "Redstone Reception Coil",
  27.         "Rhodochrosite",
  28.         "Ardite Tool Rod",
  29.         "Red Nether Brick"
  30.     },
  31.     ["Empowered Enori Crystal Block"] = {
  32.         "Enori Crystal Block",
  33.         "Bone Block",
  34.         "Osmium Ingot",
  35.         "Fluorite",
  36.         "Block of Quartz"
  37.     },
  38.     ["Empowered Palis Crystal Block"] = {
  39.         "Palis Crystal Block",
  40.         "Dense Lapis Lazuli Plate",
  41.         "Sapphire",
  42.         "Congealed Slime Block",
  43.         "Cobalt Ingot"
  44.     },
  45.     ["Empowered Diamatine Crystal Block"] = {
  46.         "Diamatine Crystal Block",
  47.         "Mana Diamond",
  48.         "Manyullyn Ingot",
  49.         "Malachite",
  50.         "Zirconium Dust"
  51.     },
  52.     ["Hardened Cell Frame"] = {
  53.         "Energy Cell Frame",
  54.         "Invar Plate",
  55.         "Invar Gear",
  56.         "Steel Casing",
  57.         "Steel Rod"
  58.     },
  59.     ["Ultimate Control Circuit"] = {
  60.         "Elite Control Circuit",
  61.         "Atomic Alloy",
  62.         "Atomic Alloy",
  63.         "Atomic Alloy",
  64.         "Atomic Alloy"
  65.     }
  66. }
  67.  
  68. local Rotation = {
  69.     Front = 0,
  70.     Right = 1,
  71.     Back = 2,
  72.     Left = 3
  73. }
  74.  
  75. local Robot = {
  76.     new = function(_x, _y, _z, _rotation)
  77.         local x = _x
  78.         local y = _y
  79.         local z = _z
  80.         local rotation = _rotation
  81.  
  82.         local rotateTo = function(self, rotation)
  83.             if self.rotation ~= rotation then
  84.                 local right = (4 - self.rotation + rotation) % 4
  85.                 local left = (4 + self.rotation - rotation) % 4
  86.                 if right == 2 or left == 2 then
  87.                     robot_api.turnAround()
  88.                     self.rotation = (self.rotation + 2) % 4
  89.                 elseif right < left then
  90.                     robot_api.turnRight()
  91.                     self.rotation = (self.rotation + 1) % 4
  92.                 else
  93.                     robot_api.turnLeft()
  94.                     self.rotation = (4 + self.rotation - 1) % 4
  95.                 end
  96.             end
  97.         end
  98.  
  99.         local moveUp = function(self)
  100.             local ok, error = robot_api.up()
  101.             if ok then
  102.                 self.y = self.y + 1
  103.             end
  104.  
  105.             return ok, error
  106.         end
  107.  
  108.         local moveDown = function(self)
  109.             local ok, error = robot_api.down()
  110.             if ok then
  111.                 self.y = self.y - 1
  112.             end
  113.  
  114.             return ok, error
  115.         end
  116.  
  117.         local moveLeft = function(self)
  118.             self:rotateTo(Rotation.Left)
  119.  
  120.             local ok, error = robot_api.forward()
  121.             if ok then
  122.                 self.x = self.x - 1
  123.             end
  124.  
  125.             return ok, error
  126.         end
  127.  
  128.         local moveRight = function(self)
  129.             self:rotateTo(Rotation.Right)
  130.  
  131.             local ok, error = robot_api.forward()
  132.             if ok then
  133.                 self.x = self.x + 1
  134.             end
  135.  
  136.             return ok, error
  137.         end
  138.  
  139.         local moveFront = function(self)
  140.             self:rotateTo(Rotation.Front)
  141.  
  142.             local ok, error = robot_api.forward()
  143.             if ok then
  144.                 self.z = self.z + 1
  145.             end
  146.  
  147.             return ok, error
  148.         end
  149.  
  150.         local moveBack = function(self)
  151.             self:rotateTo(Rotation.Back)
  152.  
  153.             local ok, error = robot_api.forward()
  154.             if ok then
  155.                 self.z = self.z - 1
  156.             end
  157.  
  158.             return ok, error
  159.         end
  160.  
  161.         local tryMove = function(self, pos, condition, movement)
  162.             while condition(self, pos) do
  163.                 local ok, error = movement(self)
  164.                 if not ok then
  165.                     return false
  166.                 end
  167.             end
  168.  
  169.             return true
  170.         end
  171.  
  172.         local moveTo = function(self, pos)
  173.             while self.x ~= pos.x or self.y ~= pos.y or self.z ~= pos.z do
  174.                 self:tryMove(pos, function(self, pos) return self.x < pos.x end, self.moveRight)
  175.                 self:tryMove(pos, function(self, pos) return self.x > pos.x end, self.moveLeft)
  176.  
  177.                 self:tryMove(pos, function(self, pos) return self.y < pos.y end, self.moveUp)
  178.                 self:tryMove(pos, function(self, pos) return self.y > pos.y end, self.moveDown)
  179.  
  180.                 self:tryMove(pos, function(self, pos) return self.z < pos.z end, self.moveFront)
  181.                 self:tryMove(pos, function(self, pos) return self.z > pos.z end, self.moveBack)
  182.             end
  183.         end
  184.  
  185.         return {
  186.             -- Members
  187.             x = x,
  188.             y = y,
  189.             z = z,
  190.  
  191.             rotation = rotation,
  192.  
  193.             -- Methods
  194.             rotateTo = rotateTo,
  195.  
  196.             moveUp = moveUp,
  197.             moveDown = moveDown,
  198.             moveLeft = moveLeft,
  199.             moveRight = moveRight,
  200.             moveFront = moveFront,
  201.             moveBack = moveBack,
  202.  
  203.             tryMove = tryMove,
  204.             moveTo = moveTo
  205.         }
  206.     end
  207. }
  208.  
  209. local checkInventoryForCraft = function()
  210.     local items = component.inventory_controller.getAllStacks(sides.front)
  211.     if not items then
  212.         print("No items on side front")
  213.     else
  214.         local recipe = nil
  215.         for slot, item in ipairs(items) do
  216.             if item.size > 0 then
  217.                 if not recipe then
  218.                     for name, items in pairs(Recipes) do
  219.                         for n, comp in ipairs(items) do
  220.                             if item.label == comp then
  221.                                 print("Found recipe '" .. name .. "'")
  222.                                 print("Found component '" .. item.label .. "'")
  223.                                 recipe = {name = name, items = items, components = {}}
  224.                                 recipe.components[1] = {name = item.label, slot = slot, main = (n == 1)}
  225.                             end
  226.                         end
  227.                     end
  228.                 else
  229.                     for n, comp in ipairs(recipe.items) do
  230.                         if item.label == comp then
  231.                             print("Found component '" .. item.label .. "'")
  232.                             recipe.components[#recipe.components + 1] = {name = item.label, slot = slot, main = (n == 1)}
  233.  
  234.                             if #recipe.components == 5 then
  235.                                 print("Found all 5 items, let's craft!")
  236.                                 return recipe
  237.                             end
  238.                         end
  239.                     end
  240.                 end
  241.             end
  242.         end
  243.     end
  244.  
  245.     if not recipe then
  246.         print("No valid recipe found.")
  247.     end
  248. end
  249.  
  250. local takeRecipeItems = function(recipe)
  251.     local mainItemTook = false
  252.     for n, item in ipairs(recipe.components) do
  253.         if not item.main and not mainItemTook then
  254.             robot_api.select(n + 1)
  255.         elseif item.main then
  256.             robot_api.select(1)
  257.             mainItemTook = true
  258.         else
  259.             robot_api.select(n)
  260.         end
  261.  
  262.         component.inventory_controller.suckFromSlot(sides.front, item.slot, 1)
  263.     end
  264. end
  265.  
  266. local chest = {x = 0, y = 0, z = 2}
  267. local charger = {x = 0, y = 0, z = 0}
  268.  
  269. local robot = Robot.new(0, 0, 0, Rotation.Front)
  270.  
  271. local tryToCraft = function()
  272.     robot:moveTo(chest)
  273.     robot:rotateTo(Rotation.Left)
  274.  
  275.     local recipe = checkInventoryForCraft()
  276.     if recipe then
  277.         takeRecipeItems(recipe)
  278.  
  279.         local locations = {
  280.             [1] = {x =  0, y = 1, z = 5, rotation = Rotation.Right}, -- Empowerer
  281.             [2] = {x = -1, y = 1, z = 5, rotation = Rotation.Left},  -- Display Stand 1
  282.             [3] = {x =  1, y = 1, z = 7, rotation = Rotation.Front}, -- Display Stand 2
  283.             [4] = {x =  3, y = 1, z = 5, rotation = Rotation.Right}, -- Display Stand 3
  284.             [5] = {x =  1, y = 1, z = 3, rotation = Rotation.Back},  -- Display Stand 4
  285.             [6] = {x =  0, y = 0, z = 3, rotation = Rotation.Left}   -- Output chest
  286.         }
  287.  
  288.         for n, location in ipairs(locations) do
  289.             if n < 6 then
  290.                 robot:moveTo(location)
  291.                 robot:rotateTo(location.rotation)
  292.  
  293.                 robot_api.select(n)
  294.                 component.inventory_controller.dropIntoSlot(sides.front, 1, 1)
  295.             end
  296.         end
  297.  
  298.         -- Now move to Empowerer and wait the craft to finish
  299.         robot:moveTo(locations[1])
  300.         robot:rotateTo(locations[1].rotation)
  301.  
  302.         while component.inventory_controller.getStackInSlot(sides.front, 1).label ~= recipe.name do
  303.             term.clear()
  304.             print("Waiting for '" .. recipe.name .. "'...")
  305.             os.sleep(5)
  306.         end
  307.  
  308.         term.clear()
  309.         print("Crafted '" .. recipe.name .. "' successfully!")
  310.  
  311.         robot_api.select(6)
  312.         component.inventory_controller.suckFromSlot(sides.front, 1, 1)
  313.  
  314.         -- Move to the output chest and drop the crafted item
  315.         robot:moveTo(locations[6])
  316.         robot:rotateTo(locations[6].rotation)
  317.  
  318.         component.inventory_controller.dropIntoSlot(sides.front, 1, 1)
  319.     end
  320.  
  321.     robot:moveTo(charger)
  322.     robot:rotateTo(Rotation.Front)
  323. end
  324.  
  325. while true do
  326.     term.clear()
  327.     print("Looking for a new craft to do...")
  328.  
  329.     tryToCraft()
  330.  
  331.     print("Resting for 10 seconds...")
  332.     os.sleep(10)
  333. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement