Advertisement
ailenkai

Spaceship Script

Sep 23rd, 2023 (edited)
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.83 KB | None | 0 0
  1. local playerFolder = game.Workspace.Players
  2. local cockpit = true
  3.  
  4. local inpart, outpart
  5.  
  6. local UserInputService = game:GetService("UserInputService")
  7. local RunService = game:GetService("RunService")
  8. local rs = game:GetService("ReplicatedStorage")
  9.  
  10. local player = game:GetService("Players").LocalPlayer
  11. local mouse = player:GetMouse()
  12.  
  13. game.Workspace.CurrentCamera:Remove()
  14. local camera = Instance.new("Camera",workspace)
  15. camera.Name = player.Name.."Camera"
  16. camera.CameraType = Enum.CameraType.Scriptable
  17.  
  18. local X, Y = mouse.X, mouse.Y
  19. local ViewX, ViewY = camera.ViewportSize.X, camera.ViewportSize.Y
  20. local center = Vector2.new(ViewX/ 2, ViewY / 2)
  21.  
  22. local minFOV, maxFOV = 40, 90
  23. local currentFOV = maxFOV
  24. local FOVstep = 5
  25.  
  26. local radius = 30
  27. local rotSensetivity = 5
  28. local maxZRot = 60 -- yaw
  29. local maxAccel = 50
  30. local currentAccel = 30
  31. local isFiring
  32. local freeview = false
  33. local currentGun = 1
  34. local lastAccelTick, lastApplyAccelTick, lastBoltFired = tick(), tick(), tick()
  35. local w, s, a, d, f, q, e = false, false, false, false, false, false, false
  36.  
  37. local changepos = rs.changepos
  38. local firebolt = rs.firebolt
  39.  
  40. function lerp(a, b, t)
  41.     return a * (1-t) + (b*t)
  42. end
  43.  
  44. -- get value from one screen to the other starting from the center
  45. function calculateValue(axis, valmin, valmax)
  46.     local percentage = mouse[axis] / camera.ViewportSize[axis]
  47.     local valueRange = valmax - valmin
  48.     local calculatedValue = (percentage * valueRange) + valmin
  49.     return calculatedValue
  50. end
  51.  
  52. mouse.WheelForward:Connect(function()
  53.     if freeview then
  54.         if currentFOV >= (minFOV+FOVstep) then
  55.             currentFOV -= FOVstep
  56.         end
  57.     else
  58.         if currentAccel < maxAccel then
  59.             currentAccel += 5
  60.         end
  61.     end
  62.    
  63. end)  
  64.  
  65. mouse.WheelBackward:Connect(function() 
  66.     if freeview then
  67.         if currentFOV <= (maxFOV-FOVstep) then
  68.             currentFOV += FOVstep
  69.         end
  70.     else
  71.         if currentAccel > 0 then
  72.             currentAccel -= 5
  73.         end
  74.     end
  75. end)
  76.  
  77. UserInputService.InputBegan:Connect(function(input)
  78.     if input.KeyCode == Enum.KeyCode.C then
  79.         if not cockpit then
  80.             cockpit = true
  81.             camera.FieldOfView = maxFOV
  82.             currentFOV = maxFOV
  83.         else
  84.             cockpit = false
  85.             camera.FieldOfView = maxFOV
  86.             currentFOV = maxFOV
  87.         end
  88.     end
  89.    
  90.     if input.KeyCode == Enum.KeyCode.Q then
  91.         q = true
  92.     end
  93.     if input.KeyCode == Enum.KeyCode.E then
  94.         e = true
  95.     end
  96.     if input.KeyCode == Enum.KeyCode.W then
  97.         w = true
  98.     end
  99.     if input.KeyCode == Enum.KeyCode.S then
  100.         s = true
  101.     end
  102.     if input.KeyCode == Enum.KeyCode.A then
  103.         a = true
  104.     end
  105.     if input.KeyCode == Enum.KeyCode.D then
  106.         d = true
  107.     end
  108.     if input.KeyCode == Enum.KeyCode.F then
  109.         freeview = true
  110.         f = true
  111.     end
  112.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  113.         isFiring = true
  114.     end
  115. end)
  116.  
  117. UserInputService.InputEnded:Connect(function(input)
  118.     if input.KeyCode == Enum.KeyCode.Q then
  119.         q = false
  120.     end
  121.     if input.KeyCode == Enum.KeyCode.E then
  122.         e = false
  123.     end
  124.     if input.KeyCode == Enum.KeyCode.W then
  125.         w = false
  126.     end
  127.     if input.KeyCode == Enum.KeyCode.S then
  128.         s = false
  129.     end
  130.     if input.KeyCode == Enum.KeyCode.A then
  131.         a = false
  132.     end
  133.     if input.KeyCode == Enum.KeyCode.D then
  134.         d = false
  135.     end
  136.     if input.KeyCode == Enum.KeyCode.F then
  137.         freeview = false
  138.         f = false
  139.     end
  140.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  141.         isFiring = false
  142.     end
  143. end)
  144.  
  145. -- center of screen to edges in pixels
  146. function getDistanceFromCenter(position)
  147.     return (position - center).Magnitude
  148. end
  149.  
  150. --repeat task.wait() until playerFolder[player.Name] ~= nil
  151.  
  152. local lastRotX = 0
  153. local lastRotY = 0
  154. local lastRotZ = 0
  155.  
  156. function updateCamera()
  157.     --print(currentFOV)
  158.    
  159.    
  160.     if playerFolder[player.Name] ~= nil then
  161.         mouse.Icon = "http://www.roblox.com/asset/?id=13734905207"
  162.        
  163.         local camera = workspace:FindFirstChild(player.Name.."Camera")
  164.        
  165.         X, Y = mouse.X, mouse.Y
  166.         ViewX, ViewY = camera.ViewportSize.X, camera.ViewportSize.Y
  167.         center = Vector2.new(ViewX/ 2, ViewY / 2)
  168.  
  169.         local ship = playerFolder[player.Name]
  170.         local inHUD = ship.inHUD
  171.         local accelBar = inHUD.SurfaceGui.Frame.Accel.Accel.bar
  172.         local shipOrigin = ship.Origin
  173.         local shipSounds = shipOrigin.Sounds
  174.         local thrusterSound = shipOrigin.Sounds.thruster
  175.         local blasterSound = shipOrigin.Sounds.blaster
  176.        
  177.         local shipPosition = shipOrigin.Attachment.AlignPosition
  178.         local shipOrientation = shipOrigin.Attachment.AlignOrientation
  179.        
  180.         local shipThrusters = {}
  181.         local shipGuns = {ship.leftGun, ship.rightGun}
  182.        
  183.         -- get both thrusters, put it in a table
  184.         for _, v in pairs(ship:GetChildren())do
  185.             if v.Name == "Thruster" then
  186.                 table.insert(shipThrusters, v)
  187.             end
  188.         end
  189.        
  190.         local serverdata = require(ship.serverdata)
  191.         serverdata.cameralookvector = camera.CFrame.LookVector
  192.         serverdata.cameraupvector = camera.CFrame.UpVector
  193.         local delta = UserInputService:GetMouseDelta()
  194.         local x, y = delta.X, delta.Y
  195.        
  196.        
  197.         local turning = false
  198.         local centerTodistance = getDistanceFromCenter(Vector2.new(X, Y))
  199.         local incircle = ViewY/17
  200.         local outcircle = ViewY/2.4
  201.         local rotation = (camera.CFrame-camera.CFrame.Position) * CFrame.Angles(math.rad(0),math.rad(0),math.rad(0))
  202.        
  203.         --rotation =  (camera.CFrame-camera.CFrame.Position) * CFrame.Angles(math.rad((-y)*rotSensetivity),math.rad((-x)*rotSensetivity),math.rad(0))
  204.        
  205.         --X >= 0 and X <= ViewX and Y >= 0 and Y <= ViewY and
  206.         if camera and ship then
  207.             local xValue = calculateValue("X", -20, 20)
  208.             local yValue = calculateValue("Y", -20, 20)
  209.             camera.FieldOfView = lerp(camera.FieldOfView, currentFOV, 0.2)
  210.             if cockpit then--doesn't need editting
  211.                 -- in first person
  212.                 camera.CFrame = ship:FindFirstChild("inPart").CFrame * CFrame.Angles(-math.rad(yValue) , -math.rad(xValue) ,0)
  213.             else
  214.                 -- in third person
  215.                 camera.CFrame = camera.CFrame:lerp(ship:FindFirstChild("outPart").CFrame * CFrame.Angles(-math.rad(yValue) , -math.rad(xValue) ,0), 0.1)
  216.             end
  217.         end
  218.        
  219.        
  220.        
  221.         -- if moving
  222.         if currentAccel > -1 then
  223.             if (tick() - lastAccelTick) > 0.1 then
  224.                 local xValue = calculateValue("X", -20, 20)
  225.                 local yValue = calculateValue("Y", -20, 20)
  226.                 lastAccelTick = tick()
  227.                
  228.                 -- if not moving, stop thrusters
  229.                 if currentAccel == 0 then
  230.                     thrusterSound:Stop()
  231.                 else
  232.                     if not thrusterSound.Playing then
  233.                         thrusterSound:Play()
  234.                     end
  235.                 end
  236.                
  237.                 -- if mouse in turning range
  238.                 if centerTodistance > incircle then
  239.                     turning = true
  240.                     rotSensetivity = (centerTodistance-incircle)
  241.                     rotation =  (camera.CFrame-camera.CFrame.Position) * CFrame.Angles(math.rad(-y),math.rad(-x),math.rad(0))
  242.                 else
  243.                     rotation = (camera.CFrame-camera.CFrame.Position) * CFrame.Angles(math.rad(0),math.rad(0),math.rad(0))
  244.                     turning = false
  245.                 end
  246.                
  247.                 local xx, yy, zz = math.rad(0), math.rad(0), math.rad(0)
  248.                
  249.                 -----
  250.                
  251.                 -- pressing q, rotate right
  252.                 if q and not e then
  253.                     yy = math.rad((-x)+maxZRot)
  254.                 end
  255.                
  256.                 -- pressing e, rotate left
  257.                 if e and not q then
  258.                     yy = math.rad((-x)-maxZRot)
  259.                 end
  260.                
  261.                 -----
  262.                
  263.                 -- pressing d, tilt right
  264.                 if d and not a then
  265.                     zz = math.rad(-maxZRot)
  266.                 end
  267.                
  268.                 -- pressing a, tilt left
  269.                 if a and not d then
  270.                     zz = math.rad(maxZRot)
  271.                 end
  272.                
  273.                 -----
  274.                
  275.                 -- pressing w, tilt down
  276.                 if w and not s then
  277.                     xx = math.rad((-y)-maxZRot)
  278.                 end
  279.                
  280.                 -- pressing s, tilt up
  281.                 if s and not w then
  282.                     xx = math.rad((-y)+maxZRot)
  283.                 end
  284.                
  285.                 if a or d or w or s or q or e then
  286.                     rotation =  (camera.CFrame-camera.CFrame.Position) * CFrame.Angles(xx,yy,zz)
  287.                 end
  288.                
  289.                 -----
  290.  
  291.                 -- change thruster particles based on speed
  292.                 for _, v in pairs(shipThrusters)do
  293.                     if v and v.Flames then
  294.                         v.Flames.Rate = (currentAccel/maxAccel)*100
  295.                     end
  296.                 end
  297.                
  298.                
  299.                
  300.                 -- apply changes to the server
  301.                 changepos:FireServer(camera.CFrame.LookVector * currentAccel, rotation)
  302.                
  303.             end
  304.         end
  305.        
  306.         -- set thruster volume
  307.         thrusterSound.PitchShiftSoundEffect.Octave = lerp(thrusterSound.PitchShiftSoundEffect.Octave,(currentAccel/maxAccel),0.1)
  308.         thrusterSound.Volume = lerp(thrusterSound.Volume, (currentAccel/maxAccel) * 0.15, 0.1)
  309.        
  310.         --hud speed bar
  311.         accelBar.Size = UDim2.new(1,0,(currentAccel/maxAccel),0)
  312.        
  313.         -- self explainatory
  314.         if isFiring then
  315.            
  316.             if (tick()-lastBoltFired) > 0.12 then
  317.                 print("firing")
  318.                 if currentGun == 1 then
  319.                     blasterSound:Play()
  320.                     firebolt:FireServer(ship, shipGuns, currentGun)
  321.                     currentGun = 2
  322.                     lastBoltFired = tick()
  323.                 elseif currentGun == 2 then
  324.                     blasterSound:Play()
  325.                     firebolt:FireServer(ship, shipGuns, currentGun)
  326.                     currentGun = 1
  327.                     lastBoltFired = tick()
  328.                 end
  329.             end
  330.            
  331.         end
  332.     else
  333.         return warn("no ship")
  334.     end
  335.    
  336. end
  337.  
  338. RunService.RenderStepped:Connect(function()
  339.     --if playerFolder[player.Name] ~= nil then
  340.         updateCamera()
  341.     --end
  342. end)
  343.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement