Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local duration = 0.4
- local floors = {}
- function tableHas(t, element)
- for i = 1, #t do
- if t[i] == element then
- return true
- end
- end
- return false
- end
- function get_modem_side()
- for _, sSide in ipairs(rs.getSides()) do
- if peripheral.getType(sSide) == "modem" and peripheral.call(sSide, "isWireless") then
- sModemSide = sSide
- break
- end
- end
- return sModemSide
- end
- function move(pos_relative)
- print("[Move] move relative" .. pos_relative)
- if pos_relative == 0 then
- return
- end
- if pos_relative > 0 then
- print("[Move] set back to 0")
- redstone.setAnalogOutput("back", 0)
- else
- print("[Move] set back to 1")
- redstone.setAnalogOutput("back", 1)
- end
- redstone.setAnalogOutput("right", 1)
- if pos_relative > 0 then
- print("[Move] sleep for " .. (duration * pos_relative + 0.2))
- sleep(duration * pos_relative + 0.2)
- else
- print("[Move] sleep for " .. (-duration * pos_relative + 0.2))
- sleep(-duration * pos_relative + 0.2)
- end
- redstone.setAnalogOutput("right", 0)
- end
- function openDoor(pos)
- rednet.broadcast(pos, "open_door")
- end
- function closeDoor(os)
- rednet.broadcast(nil, "close_door")
- end
- function Cupdate_floors()
- while true do
- local _, floor = rednet.receive("update_floor")
- if not tableHas(floors, floor) then
- print("[Update floor] Registered level " .. floor)
- table.insert(floors, floor)
- table.sort(floors)
- rednet.broadcast(floors, "update_floors")
- end
- end
- end
- function Cbroadcast_floors()
- while true do
- sleep(1)
- rednet.broadcast(floors, "update_floors")
- end
- end
- function Ccontrol()
- while #floors == 0 do
- sleep(2) -- wait for all floors to ready
- end
- print("[Control] floors registered " .. table.concat(floors, ", "))
- local _, current = rednet.receive("current_floor")
- print("[Control] stopped at " .. current)
- local initial_pos = floors[1]
- print("[Control] locate to " .. initial_pos)
- move(initial_pos - current)
- openDoor(initial_pos)
- while true do
- local _, current = rednet.receive("current_floor")
- print("[Control] stopped at " .. current)
- local _, next_pos = rednet.receive("move_to")
- print("[Control] locate to " .. next_pos)
- closeDoor()
- move(next_pos - current)
- openDoor(next_pos)
- end
- end
- rednet.open(get_modem_side())
- parallel.waitForAll(Cupdate_floors, Cbroadcast_floors, Ccontrol)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement