Advertisement
thezer0th

oc_ia.lua

Dec 27th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. local component = require("component")
  2. local sides = require("sides")
  3. local thread = require("thread")
  4. local os = require("os")
  5.  
  6. local rc_in = sides.north
  7. local prim_in = sides.west
  8. local prim_out = sides.down
  9. local auxl_in = sides.east
  10. local auxl_out = sides.south
  11. local out = sides.north
  12. local rc_tp_addr = "6063f7a8-61d8-49b9-94ff-2356535d4b13"
  13. local rc_tp = component.proxy(rc_tp_addr)
  14. local sleep_t = 0.1
  15.  
  16. local function is_empty(tp, side)
  17. local max = tp.getInventorySize(side)
  18. for idx = 1, max do
  19. if tp.getStackInSlot(side, idx) ~= nil then return false end
  20. end
  21. return true
  22. end
  23.  
  24. local function transfer_single(tp, in_side, in_slot, out_side, out_slot)
  25. tp.transferItem(in_side, out_side, tp.getStackInSlot(in_side, in_slot).count, in_side, out_side)
  26. end
  27.  
  28. local function transfer_all(tp, in_side, out_side)
  29. local out_slot = 1
  30. local max = tp.getInventorySize(in_side)
  31. for idx = 1, max do
  32. while tp.getStackInSlot(out_side, out_slot) ~= nil do out_slot = out_slot + 1 end
  33. transfer_single(tp, in_side, idx, out_side, out_slot)
  34. end
  35. end
  36.  
  37. local function wait_for_rc_items()
  38. while is_empty(rc_tp, rc_in) do os.sleep(sleep_t) end
  39. end
  40.  
  41. local function wait_for_free_slave()
  42. while true do
  43. for addr, type in component.list() do
  44. if type == "transposer" and addr ~= rc_tp_addr then
  45. local slave_tp = component.proxy(addr)
  46. if is_empty(slave_tp, prim_out) then return slave_tp end
  47. end
  48. end
  49. end
  50. end
  51.  
  52. local function split_rc_items()
  53. local function get_slot_of_prim()
  54. local recipes = {
  55. { items = { "Dragonstone" }, prim = "Dragonstone" },
  56. { items = { "Nether Star" }, prim = "Nether Star" },
  57. { items = { "Mirrored Glass" }, prim = "Mirrored Glass" },
  58. { items = { "Magic Mirror" }, prim = "Magic Mirror" },
  59. { items = { "ME Interface" }, prim = "ME Interface" },
  60. { items = { "Thaumonomicon" }, prim = "Thaumonomicon" },
  61. { items = { "Alchemical Furnace" }, prim = "Alchemical Furnace" },
  62. { items = { "Witches Oven" }, prim = "Witches Oven" },
  63. { items = { "Draconic Core"}, prim = "Draconic Core" },
  64. { items = { "Draconium Infused Obsidian" }, prim = "Draconium Infused Obsidian" },
  65. { items = { "Thaumium Pickaxe" }, prim = "Thaumium Pickaxe" },
  66. { items = { "Block of Terrasteel" }, prim = "Block of Terrasteel" },
  67. { items = { "Primal Charm" }, prim = "Primal Charm" }
  68. }
  69. local function get_slot_of(label)
  70. local max = rc_tp.getInventorySize(rc_in)
  71. for idx = 1, max do
  72. local stack = rc_tp.getStackInSlot(rc_in, idx)
  73. if stack ~= nil and stack.label == label then return idx end
  74. end
  75. return nil
  76. end
  77. local function for_all(pred, table)
  78. for _, value in pairs(table) do
  79. if not pred(value) then return false end
  80. end
  81. return true
  82. end
  83. local function pred(label) return get_slot_of(label) ~= nil end
  84. for _, recipe in pairs(recipes) do
  85. if for_all(pred, recipe.items) then return get_slot_of(recipe.prim) end
  86. end
  87. return nil
  88. end
  89. local prim_slot = get_slot_of_prim()
  90. transfer_single(rc_tp, rc_in, prim_slot, prim_in, 1)
  91. transfer_all(rc_tp, rc_in, auxl_in)
  92. end
  93.  
  94. local function setup_watchdog(slave_tp, original)
  95. local function watchdog_fn()
  96. local function is_same(lstack, rstack)
  97. return lstack.label == rstack.label and lstack.count == rstack.count
  98. end
  99. while is_same(slave_tp.getStackInSlot(prim_out, 1), original) do os.sleep(sleep_t) end
  100. transfer_single(slave_tp, prim_out, 1, out, slave_tp.getInventorySize(out))
  101. end
  102. thread.create(watchdog_fn)
  103. end
  104.  
  105. local function main()
  106. while true do
  107. wait_for_rc_items()
  108. local free_slave_tp = wait_for_free_slave()
  109. split_rc_items()
  110. local original_prim = rc_tp.getStackInSlot(prim_in, 1)
  111. transfer_all(free_slave_tp, auxl_in, auxl_out)
  112. transfer_single(free_slave_tp, prim_in, 1, prim_out, 1)
  113. setup_watchdog(free_slave_tp, original)
  114. end
  115. end
  116.  
  117. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement