SHARE
TWEET

Dapper Map Viewer

Oeed Jun 24th, 2016 (edited) 206 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local g, b = colours.green, colours.blue
  2. local logo = {{0,0,0,b,g,g,g,g,g,b},{0,b,b,g,g,g,g,g,g,g,b,b},{b,b,b,b,g,g,g,g,g,b,b,b,b},{b,g,b,b,b,g,g,g,b,b,b,b,g},{b,b,b,b,b,g,b,b,b,b,b,b,g},{b,b,b,b,b,b,g,g,b,b,b,b,b},{b,b,b,b,b,g,g,g,g,g,b,b,b},{0,b,b,b,b,b,g,g,g,g,b,b},{0,0,0,b,b,b,b,g,g,b}}
  3.  
  4. local width, height = term.getSize()
  5. term.setBackgroundColour(colours.black)
  6. term.clear()
  7.  
  8. local logoWidth, logoHeight = 13, 9
  9. local logoY = math.ceil((height - logoHeight) / 2) - 2
  10. paintutils.drawImage(logo, math.ceil((width - logoWidth) / 2), logoY)
  11.  
  12. local splashText = "A Rather Dapper Mapper"
  13. term.setCursorPos(1 + math.ceil((width - #splashText) / 2), logoY + logoHeight + 2)
  14. term.setBackgroundColour(colours.black)
  15. term.setTextColor(colours.white)
  16. term.write(splashText)
  17.  
  18. term.setCursorPos(math.ceil((width - 7) / 2), logoY + logoHeight + 3)
  19. term.setTextColor(colours.lightBlue)
  20. term.write("by oeed")
  21. sleep(2)
  22. term.setBackgroundColour(colours.black)
  23. term.clear()
  24.  
  25. local DAPPER_CLIENT_REQUEST_CHANNEL = 4261
  26. local DAPPER_CLIENT_DATA_CHANNEL = 4262
  27. local DAPPER_CLIENT_REQUEST_MAP = "mapdata"
  28.  
  29. local modem = peripheral.find("modem")
  30. if not modem or not modem.isWireless() then
  31.     error("Please connect a wireless modem and re-run the program.", 0)
  32. end
  33.  
  34. modem.open(DAPPER_CLIENT_REQUEST_CHANNEL)
  35. modem.open(DAPPER_CLIENT_DATA_CHANNEL)
  36.  
  37. local bannerText = "Connecting..."
  38. local pixels
  39. local positionX, positionY, positionZ
  40. local mapX, mapZ
  41. local isPositionLocked = true
  42. local direction = "o"
  43. local zoom = 1
  44. local directionColour = colours.white
  45. local needsMapRedraw = true
  46. local function location()
  47.     local x, y, z = gps.locate(2)
  48.     if not x or not y or not z then
  49.         bannerText = "No GPS Signal"
  50.         return positionX, positionY, positionZ
  51.     end
  52.     if bannerText == "No GPS Signal" then
  53.         bannerText = nil
  54.     end
  55.     return math.floor(x + 0.5), math.floor(y + 0.5), math.floor(z + 0.5)
  56. end
  57.  
  58. positionX, positionY, positionZ = location()
  59. mapX = positionX
  60. mapZ = positionZ
  61.  
  62. local buffer = {}
  63. for x = 1, width do
  64.     buffer[x] = {}
  65. end
  66. local function drawMap()
  67.     if bannerText then
  68.         term.setCursorPos(1 + math.ceil((width - #bannerText) / 2), 1)
  69.         term.setBackgroundColour(colours.white)
  70.         term.clearLine()
  71.         term.setTextColour(colours.red)
  72.         term.write(bannerText)
  73.         for x = 1, width do
  74.             buffer[x][1] = nil
  75.         end
  76.     end
  77.     if pixels then
  78.         local xPixel = math.floor(mapX - (zoom * width) / 2)
  79.         local zPixelStart = math.floor(mapZ - (zoom * height) / 2)
  80.         local directionX, directionY = math.floor((positionX - xPixel) / zoom + 0.5), math.floor((positionZ - zPixelStart) / zoom + 0.5)
  81.         for x = 1, width do
  82.             local xPixels = pixels[xPixel]
  83.             local zPixel = zPixelStart
  84.             local xBuffer = buffer[x]
  85.             for y = 1, height do
  86.                 if not bannerText or y > 1 then
  87.                     local pixel = xPixels and xPixels[zPixel]
  88.                     local character, textColour, backgroundColour = " ", colours.black, colours.black
  89.                     if pixel then
  90.                         character = pixel[1]
  91.                         textColour = pixel[2]
  92.                         backgroundColour = pixel[3]
  93.                     end
  94.                     if x == directionX and y == directionY then
  95.                         textColour = directionColour
  96.                         character = direction
  97.                     end
  98.                     local bufferPixel = xBuffer[y]
  99.                     if not bufferPixel or bufferPixel[1] ~= character or bufferPixel[2] ~= textColour or bufferPixel[2] ~= backgroundColour then
  100.                         xBuffer[y] = {character, textColour, backgroundColour}
  101.                         term.setCursorPos(x, y)
  102.                         term.setTextColour(textColour)
  103.                         term.setBackgroundColour(backgroundColour)
  104.                         term.write(character)
  105.                     end
  106.                 end
  107.                 zPixel = zPixel + zoom
  108.             end
  109.             xPixel = xPixel + zoom
  110.         end
  111.     end
  112.     needsMapRedraw = false
  113. end
  114.  
  115. modem.transmit(DAPPER_CLIENT_REQUEST_CHANNEL, DAPPER_CLIENT_DATA_CHANNEL, DAPPER_CLIENT_REQUEST_MAP)
  116. local mapTimeoutTime = os.clock() + 2
  117. local redrawTime = os.clock() + 0.05
  118. local updatePositionTime = os.clock() + 1
  119. local mapUpdateTime = os.clock() + 30
  120. local directionFlashTime = os.clock() + 0.5
  121. local updateTimer = os.startTimer(0.05)
  122. local dragX, dragY
  123. local didDrag = false
  124. while true do
  125.     local eventDetails = {os.pullEvent()}
  126.     local event = eventDetails[1]
  127.     if event == "timer" then
  128.         local timer = eventDetails[2]
  129.         if timer == updateTimer then
  130.             local clock = os.clock()
  131.             if mapTimeoutTime and mapTimeoutTime <= clock then
  132.                 bannerText = "No Map Server Signal"
  133.             end
  134.             if updatePositionTime <= clock then
  135.                 local oldPositionX, oldPositionZ = positionX, positionZ
  136.                 positionX, positionY, positionZ = location()
  137.                 updatePositionTime = os.clock() + 1
  138.                 if positionX ~= oldPositionX or positionZ ~= oldPositionZ then
  139.                     local xDiff, zDiff = positionX - oldPositionX, positionZ - oldPositionZ
  140.                     if math.abs(zDiff) >= math.abs(xDiff) then
  141.                         if zDiff < 0 then
  142.                             direction = "^"
  143.                         else
  144.                             direction = "v"
  145.                         end
  146.                     else
  147.                         if xDiff < 0 then
  148.                             direction = "<"
  149.                         else
  150.                             direction = ">"
  151.                         end
  152.                     end
  153.                     needsMapRedraw = true
  154.                 end
  155.                 if isPositionLocked then
  156.                     mapX, mapZ = positionX, positionZ
  157.                 end
  158.             end
  159.             if directionFlashTime <= clock then
  160.                 directionColour = (directionColour == colours.grey) and colours.white or colours.grey
  161.                 directionFlashTime = os.clock() + 0.5
  162.                 needsMapRedraw = true
  163.             end
  164.             if redrawTime <= clock then
  165.                 if needsMapRedraw then
  166.                     drawMap()
  167.                 end
  168.                 redrawTime = os.clock() + 0.05
  169.             end
  170.             if mapUpdateTime <= clock then
  171.                 modem.transmit(DAPPER_CLIENT_REQUEST_CHANNEL, DAPPER_CLIENT_DATA_CHANNEL, DAPPER_CLIENT_REQUEST_MAP)
  172.                 mapTimeoutTime = os.clock() + 2
  173.                 mapUpdateTime = os.clock() + 30
  174.             end
  175.             updateTimer = os.startTimer(0.05)
  176.         end
  177.     elseif event == "modem_message" then
  178.         local event, side, senderChannel, replyChannel, message, distance = unpack(eventDetails)
  179.         if senderChannel == DAPPER_CLIENT_DATA_CHANNEL then
  180.             needsMapRedraw = true
  181.             pixels = message
  182.             mapUpdateTime = os.clock() + 50
  183.             mapTimeoutTime = false
  184.             if bannerText == "No Map Server Signal" or bannerText == "Connecting..." then
  185.                 bannerText = nil
  186.             end
  187.         end
  188.     elseif event == "key" then
  189.         local key = eventDetails[2]
  190.         if key == keys.minus then
  191.             zoom = math.min(zoom + 1, 10)
  192.             needsMapRedraw = true
  193.         elseif key == keys.equals then
  194.             zoom = math.max(zoom - 1, 1)
  195.             needsMapRedraw = true
  196.         elseif key == keys.space then
  197.             isPositionLocked = true
  198.             mapX, mapZ = positionX, positionZ
  199.             needsMapRedraw = true
  200.         end
  201.     elseif event == "mouse_click" then
  202.         dragX, dragY = eventDetails[3], eventDetails[4]
  203.         didDrag = false
  204.     elseif event == "mouse_drag" then
  205.         local x, y = eventDetails[3], eventDetails[4]
  206.         isPositionLocked = false
  207.         mapX = mapX + (dragX - x) * zoom
  208.         mapZ = mapZ + (dragY - y) * zoom
  209.         dragX, dragY = x, y
  210.         needsMapRedraw = true
  211.         didDrag = true
  212.     elseif event == "mouse_up" and not didDrag then
  213.         dragX, dragY = eventDetails[3], eventDetails[4]
  214.     end
  215. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top