Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Bomb = {
- Tool = script.Parent,
- Equipped = false,
- Tracks = {},
- Controls = {
- Forward = 0,
- Backward = 0,
- Left = 0,
- Right = 0
- },
- FlyingSpeed = 20,
- FlyingTopSpeed = 50,
- Flying = false,
- Momentum = Vector3.new(),
- LastMomentum = Vector3.new(),
- TotalMomentum = 0,
- Tilt = 0,
- LastTilt = 0,
- MouseDown = false,
- StartChargeAt = 10,
- -- to be initialized
- FlyingInertia = 0
- }
- local UIS = Game:GetService'UserInputService'
- local textBoxFocused = false
- UIS.TextBoxFocused:connect(function() textBoxFocused=true end)
- UIS.TextBoxFocusReleased:connect(function() textBoxFocused=false end)
- --
- --
- function Bomb.Validate()
- assert(Bomb.Tool:WaitForChild'FlyAnimation':IsA'Animation', 'Failed to find FlyAnimation Animation')
- assert(Bomb.Tool:WaitForChild'ChargeEnergyBall':IsA'Animation', 'Failed to find ChargeEnergyBall')
- end
- function Bomb.Initialize()
- Bomb.FlyingInertia = 1 - Bomb.FlyingSpeed/Bomb.FlyingTopSpeed
- end
- function Bomb.Start()
- Bomb.Validate()
- Bomb.Initialize()
- Bomb.Connect()
- end
- function Bomb.Connect()
- Bomb.Tool.Equipped:connect(Bomb.OnEquip)
- Bomb.Tool.Unequipped:connect(Bomb.OnUnequip)
- UIS.InputBegan:connect(Bomb.OnInput)
- UIS.InputEnded:connect(Bomb.OnInput)
- if UIS.TouchEnabled then
- UIS.JumpRequest:connect(Bomb.OnJumpRequest)
- end
- end
- function Bomb.OnEquip(mouse)
- Bomb.Equipped = true
- Bomb.GetTrack'ChargeEnergyBall':Stop()
- mouse.Icon = 'rbxasset://133931805'
- mouse.Button1Down:connect(function()
- if Bomb.MouseDown then return end
- Bomb.MouseDown = true
- local character = Bomb.Tool.Parent
- local head, humanoid = character:FindFirstChild'Head', character:FindFirstChild'Humanoid'
- if head ~= nil and head:IsA'BasePart' and humanoid ~= nil and humanoid:IsA'Humanoid' then
- mouse.Icon = 'rbxasset://133931820'
- Bomb.Tool.StartCharge:FireServer()
- Bomb.GetTrack'ChargeEnergyBall':Stop()
- Bomb.GetTrack'ChargeEnergyBall':Play()
- end
- end)
- mouse.Button1Up:connect(function()
- if not Bomb.MouseDown then return end
- Bomb.MouseDown = false
- Bomb.Tool.StopCharge:FireServer(mouse.Hit.p)
- Bomb.GetTrack'ChargeEnergyBall':Stop()
- wait()
- mouse.Icon = 'rbxasset://textures\\GunCursor.png'
- end)
- end
- function Bomb.OnUnequip()
- Bomb.Equipped = false
- end
- function Bomb.GetTrack(name)
- if Bomb.Tracks[name] then return Bomb.Tracks[name] end
- local animation = Bomb.Tool:FindFirstChild(name, true)
- assert(animation, 'Failed to find animation '..name)
- local humanoid = Bomb.Tool.Parent:FindFirstChild'Humanoid'
- assert(humanoid, 'Failed to find Humanoid')
- Bomb.Tracks[name] = humanoid:LoadAnimation(animation)
- return Bomb.GetTrack(name)
- end
- function Bomb.RemoveFlyStuff()
- local player = game.Players.LocalPlayer
- local character = player.Character
- if character then
- local torso = character:FindFirstChild'Torso'
- if torso and torso:IsA'BasePart' then
- for index, obj in next, torso:GetChildren() do
- if obj.Name == 'FlightGyro' or obj.Name == 'FlightVelocity' then
- obj:Destroy()
- end
- end
- end
- end
- end
- function Bomb.Fly()
- if not Bomb.Equipped then
- Bomb.Flying = false
- else
- Bomb.Flying = not Bomb.Flying
- end
- Bomb.RemoveFlyStuff()
- if Bomb.Flying then
- local character = Bomb.Tool.Parent
- local torso = character:FindFirstChild'Torso'
- local humanoid = character:FindFirstChild'Humanoid'
- if torso and torso:IsA'BasePart' and humanoid and humanoid:IsA'Humanoid' and humanoid.Health > 0 then
- Bomb.Momentum = torso.Velocity + torso.CFrame.lookVector*3 + Vector3.new(0, 10, 0)
- local gyro = Instance.new'BodyGyro'
- gyro.Name = 'FlightGyro'
- gyro.P = 10^6
- gyro.maxTorque = Vector3.new(1,1,1)*gyro.P
- gyro.cframe = torso.CFrame
- gyro.Parent = torso
- Bomb.Velocity = Instance.new'BodyVelocity'
- Bomb.Velocity.Name = 'FlightVelocity'
- Bomb.Velocity.velocity = Vector3.new()
- Bomb.Velocity.P = 10^4
- Bomb.Velocity.maxForce = Vector3.new(1,1,1)*10^6
- Bomb.Velocity.Parent = torso
- Bomb.GetTrack'FlyAnimation':Stop()
- Bomb.GetTrack'FlyAnimation':Play()
- while Bomb.Flying and humanoid.Health > 0 and Bomb.Equipped do
- local movement = workspace.CurrentCamera.CoordinateFrame:vectorToWorldSpace(Vector3.new(Bomb.Controls.Left+Bomb.Controls.Right, math.abs(Bomb.Controls.Forward)*0.2, Bomb.Controls.Forward+Bomb.Controls.Backward))*Bomb.FlyingSpeed
- --print(movement)
- Bomb.Momentum = (Bomb.FlyingInertia*Bomb.Momentum)+movement
- Bomb.TotalMomentum = Bomb.Momentum.magnitude
- Bomb.TotalMomentum = math.min(Bomb.TotalMomentum, Bomb.FlyingTopSpeed)
- local tilt = ((Bomb.Momentum*Vector3.new(1,0,1)).unit:Cross(((Bomb.LastMomentum*Vector3.new(1,0,1)).unit))).y
- if tostring(tilt)=="-1.#IND" or tostring(tilt)=="1.#IND" or tilt==math.huge or tilt==-math.huge or tostring(0/0) == tostring(tilt) then
- tilt=0
- end
- local abstilt = math.abs(tilt)
- if abstilt>0.06 or abstilt<0.0001 then
- if math.abs(Bomb.LastTilt)>0.0001 then
- tilt = Bomb.LastTilt*0.9
- else
- tilt = 0
- end
- else
- tilt=(Bomb.LastTilt*.77)+(tilt*.25)
- end
- Bomb.LastTilt = tilt
- if Bomb.TotalMomentum < 0.5 then
- Bomb.Momentum = Vector3.new()
- Bomb.TotalMomentum = 0
- gyro.cframe = workspace.CurrentCamera.CoordinateFrame
- else
- gyro.cframe = CFrame.new(Vector3.new(0,0,0),Bomb.Momentum)*CFrame.Angles(0,0,tilt*(-20))*CFrame.Angles(math.pi*(-.5)*(Bomb.TotalMomentum/Bomb.FlyingTopSpeed),0,0)
- end
- Bomb.Velocity.velocity = Bomb.Momentum
- Bomb.LastMomentum = Bomb.Momentum
- wait()
- end
- Bomb.RemoveFlyStuff()
- Bomb.GetTrack'FlyAnimation':Stop()
- Bomb.Flying = false
- end
- end
- end
- function Bomb.OnInput(input)
- if input.UserInputType == Enum.UserInputType.Keyboard and Bomb.Equipped then
- local dir = input.UserInputState == Enum.UserInputState.Begin and 1 or 0
- if input.KeyCode == Enum.KeyCode.N and dir==1 then
- Bomb.OnJumpRequest()
- elseif input.KeyCode == Enum.KeyCode.W then
- Bomb.Controls.Forward = -1*dir
- elseif input.KeyCode == Enum.KeyCode.A then
- Bomb.Controls.Left = -1*dir
- elseif input.KeyCode == Enum.KeyCode.S then
- Bomb.Controls.Backward = 1*dir
- elseif input.KeyCode == Enum.KeyCode.D then
- Bomb.Controls.Right = 1*dir
- end
- end
- end
- function Bomb.OnJumpRequest()
- if Bomb.Equipped and not textBoxFocused then
- Bomb.Fly()
- local torso = Bomb.Tool.Parent:FindFirstChild'Torso'
- if torso and torso:IsA'BasePart' then
- torso.Velocity = Bomb.Momentum
- end
- end
- end
- --
- --
- Bomb.Start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement