SHOW:
|
|
- or go back to the newest paste.
| 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('Pitch: %s\nMotion Y: %s\nSpeed: %s',
|
| 46 | + | canvas.pitch.setText(string.format('%s\nMotion Y: %s\nSpeed: %s',
|
| 47 | - | math.floor(-meta.pitch), |
| 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 | - | modules.launch(meta.yaw, meta.pitch, meta.power) |
| 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 | - | end |
| 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) |