osmarks

arbitrarily changed version

Feb 22nd, 2022 (edited)
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local modules = peripheral.wrap "back"
  2.  
  3. local function length(x, y, z)
  4.     return math.sqrt(x * x + y * y + z * z)
  5. end
  6.  
  7. local function round(num, dp)
  8.     local mult = 10^(dp or 0)
  9.     return math.floor(num * mult + 0.5) / mult
  10. end
  11.  
  12. local canvas = modules.canvas()
  13.  
  14. -- Backported from Opus Neural ElytraFly since it has a nicer implementation than I do
  15. local function display(meta)
  16.   if canvas then
  17.     local w, h = canvas.getSize()
  18.     if not canvas.group then
  19.       canvas.group = canvas.addGroup({ w - 80, 15 })
  20.       canvas.group.addRectangle(0, 0, 60, 30, 0x00000033)
  21.       canvas.pitch = canvas.group.addText({ 4, 5 }, '') -- , 0x202020FF)
  22.       canvas.pitch.setShadow(true)
  23.       canvas.pitch.setScale(.75)
  24.       canvas.group2 = canvas.addGroup({ w - 10, 15 })
  25.       canvas.group2.addLines(
  26.         { 0,   0 },
  27.         { 0, 180 },
  28.         { 5, 180 },
  29.         { 5,   0 },
  30.         0x202020FF,
  31.         2)
  32.       canvas.meter = canvas.group2.addRectangle(0, 0, 5, 1)
  33.     end
  34.     local size = math.abs(meta.pitch) -- math.ceil(math.abs(meta.pitch) / 9)
  35.     local y = 0
  36.     local color = 0x202020FF
  37.     if meta.pitch < 0 then
  38.       y = size
  39.       color = 0x808080FF
  40.     end
  41.     canvas.meter.setPosition(0, 90 - y)
  42.     canvas.meter.setSize(5, size)
  43.     canvas.meter.setColor(color)
  44.     local my = meta.motionY
  45.     if not meta.isInWater then my = my + 0.0784 end
  46.     canvas.pitch.setText(string.format('%s\nMotion Y: %s\nSpeed: %s',
  47.       _G.flight_mode or "normal",
  48.       round(my, 2),
  49.       round(length(meta.motionX, my, meta.motionZ), 2)))
  50.   end
  51. end
  52.  
  53. --[[
  54. local function pad(s, i)
  55.     return ("%s %s%.1f"):format(s, i >= 0 and "+" or "", i)
  56. end
  57.  
  58. local overlay = {
  59.     function(meta) return pad("X:", meta.motionX) end,
  60.     function(meta) return pad("Y:", meta.motionY) end,
  61.     function(meta) return pad("Z:", meta.motionZ) end,
  62.     function(meta) return pad("  ", length(meta.motionX, meta.motionY, meta.motionZ)) end,
  63.     function(meta) return pad("P:", meta.power) end
  64. }
  65.  
  66. local objects
  67. local function draw_overlay(meta)
  68.     if not objects then
  69.         objects = {}
  70.         local w, h = canv.getSize()
  71.         for ix in pairs(overlay) do
  72.             objects[ix] = canv.addText({w - 40, ix * 10 + 5}, "")
  73.             objects[ix].setColor(0xFFFFFFFF)
  74.         end
  75.     end
  76.     for ix, f in pairs(overlay) do
  77.         objects[ix].setText(f(meta))
  78.     end
  79. end
  80. ]]
  81.  
  82. local function get_power(meta)
  83.     local power = 4
  84.     if meta.isElytraFlying or meta.isFlying then power = 1 end
  85.     if meta.isSneaking then power = 4 end
  86.     if _G.tps then
  87.         power = power * (20 / _G.tps)
  88.     end
  89.     return math.min(power, 4)
  90. end
  91.  
  92. local function get_meta()
  93.     local meta = modules.getMetaByName "gollark"
  94.     meta.power = get_power(meta)
  95.     display(meta)
  96.     return meta
  97. end
  98.  
  99. local function calc_yaw_pitch(v)
  100.     local x, y, z = v.x, v.y, v.z
  101.     local pitch = -math.atan2(y, math.sqrt(x * x + z * z))
  102.     local yaw = math.atan2(-x, z)
  103.     return math.deg(yaw), math.deg(pitch)
  104. end
  105.  
  106. local x, y, z
  107.  
  108. local function run()
  109. while true do
  110.     local meta = get_meta()
  111.  
  112.     while (not _G.stop_flight) and (meta.isSneaking or meta.isFlying or meta.isElytraFlying) do
  113.         local mode = _G.flight_mode or "normal"
  114.         print(mode)
  115.         if mode == "normal"  then
  116.             modules.launch(meta.yaw, meta.pitch, meta.power)
  117.         elseif mode == "brake" then
  118.             local vel = vector.new(meta.motionX, meta.motionY, meta.motionZ)
  119.             local y, p = calc_yaw_pitch(-vel)
  120.             modules.launch(y, p, math.min(vel:length(), 4))
  121.         elseif mode == "align" and y then
  122.             print(256 - y)
  123.             local tdir = vector.new(-math.sin(math.rad(meta.yaw)), 0.1 * math.pow(256 - y, 3) / math.abs(256 - y), math.cos(math.rad(meta.yaw)))
  124.             print(tdir)
  125.             local y, p = calc_yaw_pitch(tdir)
  126.             modules.launch(y, p, meta.power)
  127.         end
  128.         sleep(0.1)
  129.         meta = get_meta()
  130.     end
  131.  
  132.     if meta.motionY < -0.4 then
  133.         modules.launch(0, 270, meta.power / 2)
  134.         print("boost")
  135.     end
  136.  
  137.     sleep(0.4)
  138. end
  139. end
  140.  
  141. local function do_gps()
  142.     while true do
  143.         x, y, z = gps.locate()
  144.         sleep(0.2)
  145.     end
  146. end
  147.  
  148. parallel.waitForAll(do_gps, run)
Add Comment
Please, Sign In to add comment