Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local rs = game:GetService("RunService")
- local uis = game:GetService("UserInputService")
- workspace.CurrentCamera.CameraType = Enum.CameraType.Scriptable
- workspace.CurrentCamera.FieldOfView = 100
- local drone = workspace.Drone
- local deadzone = 0.05
- local drone = workspace.Drone
- local prop = drone.Thrust
- local torque = drone.Torque
- local gyro = drone.Gyro
- local rates = {}
- -- rates (units: deg/sec at max value)
- rates.Yaw = 10
- rates.Pitch = 10
- rates.Roll = 10
- local phys = {}
- phys.MaxThrust = 3 * drone.Mass * workspace.Gravity
- phys.MaxYaw = math.rad(rates.Yaw)
- phys.MaxPitch = math.rad(rates.Pitch)
- phys.MaxRoll = math.rad(rates.Roll)
- rs.RenderStepped:Connect(function()
- local inputs = getInputs(deadzone)
- local throttle = math.clamp(compDeadzone(inputs.LStick.Y), 0, 1)
- local yawIn = compDeadzone(inputs.LStick.X) * rates.Yaw
- local pitchIn = compDeadzone(inputs.RStick.Y) * rates.Pitch
- local rollIn = compDeadzone(inputs.RStick.X) * rates.Roll
- local relLinVel = drone.CFrame:VectorToObjectSpace(drone.AssemblyLinearVelocity)
- local relAngVel = drone.CFrame:VectorToObjectSpace(drone.AssemblyAngularVelocity)
- local stab = lerp(throttle, 1, 4) * drone.Mass
- local thrust = throttle * phys.MaxThrust * (1 - math.abs(relLinVel.Y/phys.MaxThrust))
- local pitch = throtToForce(-pitchIn, relAngVel.X, phys.MaxPitch)
- local yaw = throtToForce(-yawIn, relAngVel.Y, phys.MaxYaw)
- local roll = throtToForce(-rollIn, relAngVel.Z, phys.MaxRoll)
- print("Fp: "..pitch)
- print("Fy: "..yaw)
- print("Fr: "..roll)
- print("Ip: "..pitchIn)
- print("Iy: "..yawIn)
- print("Ir: "..rollIn)
- print("Vx: "..relAngVel.X)
- print("Vy: "..relAngVel.Y)
- print("Vz: "..relAngVel.Z)
- local stabForce = -stab*relAngVel
- torque.Torque = Vector3.new(pitch, yaw, roll)
- prop.Force = Vector3.new(0, thrust, 0)
- --gyro.MaxTorque = stab
- if inputs.A then
- drone.Position = Vector3.new(0, 0.5, 0)
- drone.Orientation = Vector3.new(0, 90, 0)
- drone.AssemblyLinearVelocity = Vector3.new(0,0,0)
- drone.AssemblyAngularVelocity = Vector3.new(0,0,0)
- end
- end)
- local gui = game.Players.LocalPlayer.PlayerGui:WaitForChild("ScreenGui")
- rs.RenderStepped:Connect(function()
- local pos = (drone.CFrame + drone.CFrame.LookVector*0.5 + drone.CFrame.UpVector*0.2)
- workspace.CurrentCamera.CFrame = pos*CFrame.Angles(math.rad(30),0,0)
- local inputs = getInputs(deadzone)
- gui.Left.Pos.Position = UDim2.new(inputs.LStick.X/2+0.5,0,-inputs.LStick.Y+1,0)
- gui.Right.Pos.Position = UDim2.new(inputs.RStick.X/2+0.5,0,-inputs.RStick.Y/2+0.5,0)
- end)
- function throtToForce(throttle, vel, max)
- local n = math.abs(vel / throttle)
- n = if n ~= n then 0 else n
- return throttle * (1 - math.clamp(math.pow(n, 2),0,1))
- end
- function lerp(t, a, b)
- return t*(b-a)+a
- end
- local controls = {}
- --controls.Primary = {}
- --controls.Secondary = {}
- function getInputs(deadzone:number)
- deadzone = deadzone or 0
- local rawIn:{InputObject} = uis:GetGamepadState(Enum.UserInputType.Gamepad1)
- local inputs = {}
- inputs.Menu = rawIn[1].Position.Z == 1
- inputs.Start = rawIn[3].Position.Z == 1
- inputs.A = rawIn[2].Position.Z == 1
- inputs.B = rawIn[4].Position.Z == 1
- inputs.X = rawIn[5].Position.Z == 1
- inputs.Y = rawIn[6].Position.Z == 1
- inputs.LB = rawIn[7].Position.Z == 1
- inputs.RB = rawIn[8].Position.Z == 1
- inputs.LT = rawIn[9].Position.Z
- inputs.RT = rawIn[10].Position.Z
- inputs.DpadUp = rawIn[13].Position.Z == 1
- inputs.DpadDown = rawIn[14].Position.Z == 1
- inputs.DpadLeft = rawIn[15].Position.Z == 1
- inputs.DpadRight = rawIn[16].Position.Z == 1
- inputs.LStick = Vector3.new(applyDeadzone(rawIn[17].Position.X, deadzone), applyDeadzone(rawIn[17].Position.Y, deadzone), rawIn[11])
- inputs.RStick = Vector3.new(applyDeadzone(rawIn[18].Position.X, deadzone), applyDeadzone(rawIn[18].Position.Y, deadzone), rawIn[12])
- return inputs
- end
- function getRawInputs(gamepad)
- gamepad = gamepad or Enum.UserInputType.Gamepad1
- local rawIn:{InputObject} = uis:GetGamepadState(gamepad)
- local inputs = {}
- inputs.Menu = rawIn[1].Position.Z == 1
- inputs.Start = rawIn[3].Position.Z == 1
- inputs.A = rawIn[2].Position.Z == 1
- inputs.B = rawIn[4].Position.Z == 1
- inputs.X = rawIn[5].Position.Z == 1
- inputs.Y = rawIn[6].Position.Z == 1
- inputs.LB = rawIn[7].Position.Z == 1
- inputs.RB = rawIn[8].Position.Z == 1
- inputs.LT = rawIn[9].Position.Z
- inputs.RT = rawIn[10].Position.Z
- inputs.DpadUp = rawIn[13].Position.Z == 1
- inputs.DpadDown = rawIn[14].Position.Z == 1
- inputs.DpadLeft = rawIn[15].Position.Z == 1
- inputs.DpadRight = rawIn[16].Position.Z == 1
- inputs.LStickX = rawIn[17].Position.X
- inputs.LStickY = rawIn[17].Position.Y
- inputs.LS = rawIn[11]
- inputs.RStickX = rawIn[18].Position.X
- inputs.RStickY = rawIn[18].Position.Y
- inputs.RS = rawIn[12]
- return inputs
- end
- function applyDeadzone(val, deadzone)
- local n = if math.abs(val) <= deadzone then 0 else val
- return n
- end
- function compDeadzone(input)
- return math.sign(input) * math.map(math.abs(input), deadzone, 1, 0, 1)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement