Advertisement
Derek1017

Controller

May 29th, 2015
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.85 KB | None | 0 0
  1. --File: Controller
  2. version = "v0.82"
  3. --[[
  4.   Purpose:   A utility for controlling turtles via W,S,A,D & some other keys/functions
  5.   Author(s): derekseitz
  6.   License:   MIT License - http://opensource.org/licenses/MIT
  7.   Changelog: v0.82: - Fixed improper positioning of positive outcomes
  8.              v0.81: - 'F1' page tweaks
  9.              v0.8:  - Added inspect commands & fixed inventory keys
  10.              v0.72: - Added support for fuelless turtles
  11.              v0.7:  - Cleaned up code a bit, removed unnecessary/poor humor
  12.              v0.64: - Added ACT hotkey (see http://turtlescripts.com/project/gjdh20-Act for script)
  13.              v0.63: - Added inventory info check
  14.              v0.62: - Added visual fuel bar
  15.   Todo:     - Dynamic Keybinding display
  16.             - Color GUI
  17.             - gps integration
  18.             - remote rednet control
  19. ]]
  20.  
  21. --=== Key Config ===--
  22. -- (see http://computercraft.info/wiki/Key_(event) for more keycodes)
  23. exitKey =     57      -- 57:space
  24. helpKey =     59      -- 59:F1
  25. -- movement keys
  26. forward =     17      -- 17:w
  27. back =        31      -- 31:s
  28. turnLeft =    30      -- 30:a
  29. turnRight =   32      -- 32:d
  30. strafeLeft =  44      -- 44:z
  31. strafeRight = 46      -- 46:c
  32. ascend =      18      -- 18:e
  33. descend =     16      -- 16:q
  34. turn180 =     45      -- 45:x
  35. -- action keys
  36. digUp =       19      -- 19:r
  37. digForward =  33      -- 33:f
  38. digDown =     47      -- 47:v
  39. placeUp =     20      -- 20:t
  40. placeForward =34      -- 34:g
  41. placeDown =   48      -- 48:b
  42. refuel =      41      -- 41:`
  43. refuelLava =  6       -- 6:5 (empty bucket needs to be in selected slot)
  44. doThis =      25      -- 25:p
  45. -- inventory keys
  46. invUp =       27      -- 27:rightBracket
  47. invDown =     26      -- 26:leftBracket
  48. inv1 =        2       -- 2:1
  49. inv2 =        3       -- 3:2
  50. inv3 =        4       -- 4:3
  51. inv4 =        5       -- 5:4
  52. whatsThis =   23      -- 23:i
  53. inspectUp =   21      -- 21:y
  54. inspectFore = 35      -- 35:h
  55. inspectDown = 49      -- 49:n
  56.  
  57. -- Time display variables
  58. displayDay = true
  59. militaryTime = true
  60. compactTime = false
  61.  
  62. --=== script variables ===--
  63. running = true
  64. x, y = term.getSize()
  65. currentSlot = turtle.getSelectedSlot()
  66. fuelLimit = turtle.getFuelLimit()
  67. version = os.version()
  68. versionNum = string.match(version, '%d.%d*')
  69.  
  70. --===== functions =====--
  71. local function seperator()
  72.   local sep = string.rep('=', x);
  73.   term.write(sep)
  74. end
  75.  
  76. local function cwrite(text, y)
  77.   local cx = math.ceil((x/2)-(string.len(text)/2))
  78.   term.setCursorPos(cx, y)
  79.   write(text)
  80. end
  81.  
  82. local function dayTimeUpdate()
  83.   local ret
  84.   local time = os.time()
  85.   local formattedTime = textutils.formatTime(time,militaryTime)
  86.   if compactTime then formattedTime = string.gsub(formattedTime, " ", "") end
  87.   if displayDay then
  88.     local day = os.day()
  89.     ret = ("Day" ..day .."," ..formattedTime .."> ")
  90.   else
  91.     ret = (formattedTime .."> ")
  92.   end
  93.   return ret
  94. end
  95.  
  96. local function fuelDrawUpdate()
  97.   local fuelbar
  98.   if tonumber(fuelLimit) then
  99.     local fuelLevel = turtle.getFuelLevel()
  100.  
  101.     local fuelBarHeader = "Fuel: "..fuelLevel.."/"..fuelLimit.." ["
  102.     local fuelBarFooter = "]"
  103.     local barLength = x - (string.len(fuelBarHeader) + string.len(fuelBarFooter))
  104.  
  105.     local fuelPercent = (fuelLevel/fuelLimit) * barLength
  106.     local containedFuelBar = string.rep("=",fuelPercent)
  107.     local emptyFuelBar = string.rep(".",barLength-fuelPercent)
  108.  
  109.     fuelBar = fuelBarHeader .. containedFuelBar .. emptyFuelBar .. fuelBarFooter
  110.   else
  111.     fuelBar = "Fuel Unlimited"
  112.   end
  113.   term.setCursorPos(1,2)
  114.   term.clearLine()
  115.   term.write(fuelBar)
  116. end
  117.  
  118. local function declareOutcome(message, bool, noDate)
  119.   if bool ~= nil and tonumber(fuelLimit) then
  120.    fuelDrawUpdate()
  121.   end
  122.   term.setCursorPos(1,y)
  123.   term.clearLine()
  124.   if noDate == nil then
  125.     term.write(dayTimeUpdate().. message)
  126.   else
  127.     term.write(message)
  128.   end
  129. end
  130.  
  131. function rednetOn()
  132.   local Sides = {"back","right","left","front","top","bottom"}
  133.   local side = nil
  134.   local rednetComment = "-Rednet"
  135.   for i=1,#Sides do
  136.     if peripheral.isPresent(Sides[i]) then
  137.       if peripheral.getType(Sides[i]) == "modem" then
  138.         side = Sides[i]
  139.       end
  140.     end
  141.   end
  142.   if side ~= nil then
  143.     rednet.open(side)
  144.   end
  145.   if rednet.isOpen(side) then
  146.     rednetComment = "+Rednet"
  147.   end
  148.   local rnCommentLength = string.len(rednetComment)
  149.   term.setCursorPos(x-rnCommentLength,1)
  150.   term.write(rednetComment)
  151. end
  152.  
  153. local function labelCheck()
  154.   local label = os.getComputerLabel()
  155.   local ID = os.getComputerID()
  156.   if label == nil then
  157.     shell.run("label", "set", ID)
  158.   end
  159. end
  160.  
  161. local function headerGui()
  162.   term.clear()
  163.   term.setCursorPos(1,1)
  164.   term.write("Name(ID): " .. os.getComputerLabel() .. " (" .. os.getComputerID() ..")")
  165.   rednetOn()
  166.   fuelDrawUpdate()
  167.   term.setCursorPos(1,3)
  168.   seperator()
  169. end
  170.  
  171. local function keyGUI()
  172.   cwrite("--- KEYMAP ---",4)
  173.   term.setCursorPos(1,5)
  174.   print("Movement    Dig  Pla  Insp  Inv")
  175.   print("   W    ^E   R    T    Y    1-4")
  176.   print("Z-A+D-C |    F    G    H    Next:]")
  177.   print("   S    vQ   V    B    N    Prev:[")
  178.   if tonumber(fuelLimit) then
  179.     print("180: X     Refuel:`   LavaRefuel:5")
  180.   else
  181.     print("180: X")
  182.   end
  183.   print("p:ACT   i:SlotItemInfo   F1:Help")
  184.   term.setBackgroundColor(colors.white)
  185.   term.setTextColor(colors.black)
  186.   cwrite(" Spacebar to exit ",y-2)
  187.   term.setBackgroundColor(colors.black)
  188.   term.setTextColor(colors.white)
  189.   term.setCursorPos(1,y-1)
  190.   seperator()
  191. end
  192.  
  193. local function helpScreen()
  194.   term.clear()
  195.   term.setCursorPos(1,1)
  196.   cwrite("tControl "..version,1)
  197.   term.setCursorPos(1,3)
  198.   print("- For keycodes see:")
  199.   print("computercraft.info/wiki/Key_(event)")
  200.   if tonumber(fuelLimit) then
  201.     print("- I can be refueled with lava.")
  202.     print("Give me and empty bucket & lava source block below. Then hit [5].")
  203.   end
  204.   print("- Block/item info cc1.64 & up")
  205.   -- Slot item info = {name,damage,count}") Inspect block info = {name,metadata}
  206.   print("- For ACT by McLeopold details:")
  207.   print("turtlescripts.com/project/gjdh20-Act")
  208.   local sEvent, key = os.pullEvent()
  209.   if sEvent == "key" then
  210.     return
  211.   end
  212. end
  213.  
  214. local function mainGUI()
  215.   headerGui()
  216.   keyGUI()
  217. end
  218.  
  219. local function quitTC()
  220.   term.clear()
  221.   term.setCursorPos(1,1)
  222.   term.write("Later")
  223.   running = false
  224.   term.setCursorPos(1,2)
  225. end
  226.  
  227. local function updateEvent()
  228.   while true do
  229.     local sEvent, key = os.pullEvent()
  230.     if sEvent == "key" then
  231.       if key == exitKey then
  232.         quitTC()
  233.         return
  234.       end
  235.       if key == helpKey then
  236.         helpScreen()
  237.         mainGUI()
  238.       end
  239.       -- Inventory scroll
  240.       if key == invUp then
  241.         newSlot = (currentSlot+1) % 16
  242.         if newSlot == 0 then
  243.         newSlot = 16
  244.         end
  245.         turtle.select(newSlot)
  246.         currentSlot = newSlot
  247.         declareOutcome(currentSlot .. " slot selected")
  248.       end
  249.       if key == invDown then
  250.         newSlot = (currentSlot-1) % 16
  251.         if newSlot == 0 then
  252.         newSlot = 16
  253.         end
  254.         turtle.select(newSlot)
  255.         currentSlot = newSlot
  256.         declareOutcome(currentSlot .. " slot selected")
  257.       end
  258.       if key == forward then
  259.         if turtle.forward() then
  260.           declareOutcome("Moving forward",true)
  261.         else
  262.           declareOutcome("Can't go forward")
  263.         end
  264.       end
  265.       if key == back then
  266.         if turtle.back() then
  267.           declareOutcome("Backing up",true)
  268.         else
  269.           declareOutcome("Can't go back")
  270.         end
  271.       end
  272.       if key == turnRight then
  273.         turtle.turnRight()
  274.         declareOutcome("Turning right")
  275.       end
  276.       if key == turnLeft then
  277.         turtle.turnLeft()
  278.         declareOutcome("Turning left")
  279.       end
  280.       if key == turn180 then
  281.         turtle.turnRight()
  282.         turtle.turnRight()
  283.         declareOutcome("Turned around")
  284.       end
  285.       if key == strafeRight then
  286.         turtle.turnRight()
  287.         if turtle.forward() then
  288.           turtle.turnLeft()
  289.           declareOutcome("Strafing right",true)
  290.         else
  291.           declareOutcome("Can't strafe right")
  292.           turtle.turnLeft()
  293.         end
  294.       end
  295.       if key == strafeLeft then
  296.         turtle.turnLeft()
  297.         if turtle.forward() then
  298.           turtle.turnRight()
  299.           declareOutcome("Strafing left",true)
  300.         else
  301.           declareOutcome("Can't strafe left")
  302.           turtle.turnRight()
  303.         end
  304.       end
  305.       if key == descend then
  306.         if turtle.down() then
  307.           declareOutcome("Going down",true)
  308.         else
  309.           declareOutcome("Can't go down")
  310.         end
  311.       end
  312.       if key == ascend then
  313.         if turtle.up() then
  314.           declareOutcome("Going up",true)
  315.         else
  316.           declareOutcome("Can't go up")
  317.         end
  318.       end
  319.  
  320.       -- digging
  321.       if key == digUp then
  322.         turtle.attackUp()
  323.         if turtle.digUp() then
  324.           declareOutcome("Dug up")
  325.         else
  326.           declareOutcome("Nothing up to dig")
  327.         end
  328.       end
  329.       if key == digForward then
  330.         turtle.attack()
  331.         if turtle.dig() then
  332.           declareOutcome("Dug forward")
  333.         else
  334.           declareOutcome("Nothing to dig")
  335.         end
  336.       end
  337.       if key == digDown then
  338.         turtle.attackDown()
  339.         if turtle.digDown() then
  340.           declareOutcome("Dug down")
  341.         else
  342.           declareOutcome("Nothing down to dig")
  343.         end
  344.       end
  345.      
  346.       -- placing
  347.       if key == placeUp then
  348.         if turtle.placeUp() then
  349.           declareOutcome("Placed up")
  350.         else
  351.           declareOutcome("Couldn't place up")
  352.         end
  353.       end
  354.       if key == placeForward then
  355.         if turtle.place() then
  356.           declareOutcome("Placed forward")
  357.         else
  358.           declareOutcome("Couldn't place")
  359.         end
  360.       end
  361.       if key == placeDown then
  362.         if turtle.placeDown() then
  363.           declareOutcome("Placed down")
  364.         else
  365.           declareOutcome("Couldn't place down")
  366.         end
  367.       end
  368.  
  369.       -- Inventory Slots 1-4
  370.       if key == inv1 then
  371.         turtle.select(1)
  372.         declareOutcome("Slot 1 selected")
  373.       end
  374.       if key == inv2 then
  375.          turtle.select(2)
  376.        declareOutcome("Slot 2 selected")
  377.       end
  378.       if key == inv3 then
  379.         turtle.select(3)
  380.         declareOutcome("Slot 3 selected")
  381.       end
  382.       if key == inv4 then
  383.         turtle.select(4)
  384.         declareOutcome("Slot 4 selected")
  385.       end
  386.       if versionNum >= "1.6" then
  387.         if key == whatsThis then
  388.           local data = turtle.getItemDetail()
  389.           if data then
  390.             declareOutcome(data.name..":"..data.damage, true, true)
  391.           else
  392.             declareOutcome("Nothing in this slot")
  393.           end
  394.         end
  395.         if key == inspectUp then
  396.           local success, data = turtle.inspectUp()
  397.           if success then
  398.             declareOutcome(data.name..":"..data.metadata, true, true)
  399.           else
  400.             declareOutcome("That's air")
  401.           end
  402.         end
  403.         if key == inspectFore then
  404.           local success, data = turtle.inspect()
  405.           if success then
  406.             declareOutcome(data.name..":"..data.metadata, true, true)
  407.           else
  408.             declareOutcome("That's air")
  409.           end
  410.         end
  411.         if key == inspectDown then
  412.           local success, data = turtle.inspectDown()
  413.           if success then
  414.             declareOutcome(data.name..":"..data.metadata, true, true)
  415.           else
  416.             declareOutcome("That's air")
  417.           end
  418.         end
  419.       else
  420.         declareOutcome("Cmd not in "..os.version())
  421.       end
  422.  
  423.       -- refueling
  424.       if key == refuel and tonumber(fuelLimit) then
  425.         if turtle.refuel() == false then
  426.           -- Selected isn't fuel, put it back down
  427.           declareOutcome("Couldn't refuel with this")
  428.         else
  429.           declareOutcome("Ah, much better!",true)
  430.         end
  431.       end
  432.       -- Grab fuel (generally lava) from below with bucket and refuel
  433.       if key == refuelLava and tonumber(fuelLimit) then
  434.         turtle.placeDown()
  435.         if turtle.refuel() == false then
  436.           -- Selected isn't fuel, put it back down
  437.           declareOutcome("Need lava below & bucket in slot " ..currentSlot)
  438.         else
  439.           declareOutcome("Ah, much better!",true)
  440.         end
  441.       end
  442.  
  443.       if key == doThis then
  444.         if os.loadAPI("act") then
  445.           term.setCursorPos(1, y)
  446.           term.clearLine()
  447.           sleep(0.1)
  448.           write("Command? ")
  449.           local data = read()
  450.           act.act(data)
  451.           mainGUI()
  452.           declareOutcome("Attempted "..data,true)
  453.         else
  454.           mainGUI()
  455.           declareOutcome("ACT script not found")
  456.         end
  457.       end
  458.     end -- key assigning
  459.   end
  460. end
  461.  
  462. while running do
  463.   labelCheck()
  464.   mainGUI()
  465.   updateEvent()
  466. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement