311 lines
8.0 KiB
Lua
311 lines
8.0 KiB
Lua
local Players = game:GetService("Players")
|
|
|
|
local tool = script.Parent
|
|
local plane = nil
|
|
local hold = false
|
|
local debounce = false
|
|
local planedebounce = false
|
|
local stuntdebounce = false
|
|
local controlling = false
|
|
local player
|
|
|
|
local rocket = tool:WaitForChild("Rocket")
|
|
rocket.Parent = nil
|
|
|
|
local function fireRocket(pln,spn)
|
|
local missile = rocket:Clone()
|
|
missile.CFrame = spn.CFrame * CFrame.new(0, 0, -35)
|
|
missile.Anchored = false
|
|
|
|
missile.RocketScript.Disabled = false
|
|
missile.Parent = workspace
|
|
|
|
local creator_tag = Instance.new("ObjectValue")
|
|
creator_tag.Value = player
|
|
creator_tag.Name = "creator"
|
|
creator_tag.Parent = missile
|
|
|
|
missile.Owner.Value = pln
|
|
end
|
|
|
|
local function fireDeathLaser(engine)
|
|
local dir = engine.CFrame.lookVector
|
|
for i = 1, 50 do
|
|
local ex = Instance.new("Explosion")
|
|
ex.BlastRadius = 6
|
|
ex.BlastPressure = 8000000
|
|
ex.Position = engine.Position + (dir * 50) + (dir * i * 12)
|
|
ex.Parent = workspace
|
|
end
|
|
if engine:FindFirstChild("DeathLaser") then
|
|
engine.DeathLaser:Play()
|
|
end
|
|
end
|
|
|
|
local function computeDirection(vec)
|
|
local lenSquared = vec.magnitude * vec.magnitude
|
|
local invSqrt = 1 / math.sqrt(lenSquared)
|
|
return Vector3.new(vec.x * invSqrt, vec.y * invSqrt, vec.z * invSqrt)
|
|
end
|
|
|
|
local function move(target, engine)
|
|
local bg = engine:findFirstChild("BodyGyro")
|
|
if bg then
|
|
local origincframe = bg.cframe
|
|
local dir = (target - engine.Position).unit
|
|
local spawnPos = engine.Position
|
|
|
|
local pos = spawnPos + (dir * 1)
|
|
|
|
bg.maxTorque = Vector3.new(900000, 900000, 900000)
|
|
bg.cframe = CFrame.new(pos, pos + dir)
|
|
wait(0.1)
|
|
bg.maxTorque = Vector3.new(0, 0, 0)
|
|
bg.cframe = origincframe
|
|
end
|
|
end
|
|
|
|
function findPlane(char)
|
|
local player = Players:GetPlayerFromCharacter(char)
|
|
local humanoid = char:FindFirstChildWhichIsA("Humanoid")
|
|
local plane = char:FindFirstChildWhichIsA("Model")
|
|
if plane and plane.Name == "Plane" then
|
|
local color_tag = plane:FindFirstChild("PlaneColor")
|
|
if color_tag then
|
|
color_tag.Value = player.TeamColor
|
|
end
|
|
local seat = plane:FindFirstChildWhichIsA("Seat",true)
|
|
if seat then
|
|
local occupant = seat.Occupant
|
|
if humanoid == occupant then
|
|
return plane
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onActivated()
|
|
local char = tool.Parent
|
|
local humanoid = char:FindFirstChildWhichIsA("Humanoid")
|
|
if humanoid then
|
|
local vehicle = findPlane(char)
|
|
if vehicle ~= nil and debounce == false and planedebounce == false and stuntdebounce == false then
|
|
debounce = true
|
|
player = Players:GetPlayerFromCharacter(char)
|
|
controlling = true
|
|
|
|
local engine = vehicle.Parts.Engine
|
|
|
|
while wait() do
|
|
local target = humanoid.TargetPoint
|
|
if engine:FindFirstChild("FlyScript") ~= nil then
|
|
move(target, engine)
|
|
end
|
|
if planedebounce or not controlling then
|
|
break
|
|
end
|
|
end
|
|
|
|
wait(.1)
|
|
debounce = false
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onDeactivated()
|
|
controlling = false
|
|
end
|
|
|
|
local function onKeyDown(key)
|
|
if (key~=nil) then
|
|
key = key:lower()
|
|
local char = tool.Parent
|
|
local player = game.Players:GetPlayerFromCharacter(char)
|
|
if player==nil then return end
|
|
local vehicle = findPlane(char)
|
|
if (vehicle==nil) then return end
|
|
plane = vehicle.Parts
|
|
local engine = vehicle.Parts.Engine
|
|
if (key=="f") and tool.Enabled then
|
|
local engine = plane.Engine
|
|
if engine:FindFirstChild("DeathLaserMode") and engine.DeathLaserMode.Value then
|
|
fireDeathLaser(engine)
|
|
else
|
|
fireRocket(vehicle,plane.Gun1)
|
|
fireRocket(vehicle,plane.Gun2)
|
|
end
|
|
tool.Enabled = false
|
|
wait(1)
|
|
tool.Enabled = true
|
|
end
|
|
if (key=="x") and not planedebounce then
|
|
local power = plane.Engine:FindFirstChild("FlyScript")
|
|
if (power ~= nil) then
|
|
power:Destroy()
|
|
tool.Enabled = false
|
|
for _,v in pairs(vehicle:GetDescendants()) do
|
|
if v:IsA("ParticleEmitter") and v.Name == "EngineSparkles" then
|
|
v.Enabled = false
|
|
elseif v:IsA("BodyVelocity") and v.Name == "EngineForce" then
|
|
v:Destroy()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if (key=="y") then
|
|
local power = plane.Engine:FindFirstChild("FlyScript")
|
|
if not power then
|
|
local fly = script.FlyScript:Clone()
|
|
fly.Disabled = false
|
|
fly.Parent = plane.Engine
|
|
tool.Enabled = true
|
|
for _,v in pairs(vehicle:GetDescendants()) do
|
|
if v:IsA("ParticleEmitter") and v.Name == "EngineSparkles" then
|
|
v.Enabled = true
|
|
elseif v:IsA("BasePart") and v:CanSetNetworkOwnership() then
|
|
v:SetNetworkOwner(player)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if (key=="k") and not planedebounce then
|
|
planedebounce = true
|
|
for i = 1,4 do
|
|
wait()
|
|
engine.RotVelocity = engine.RotVelocity + Vector3.new(0, -0.7, 0)
|
|
end
|
|
planedebounce = false
|
|
end
|
|
if (key=="h") and not planedebounce then
|
|
planedebounce = true
|
|
for i = 1,4 do
|
|
wait()
|
|
engine.RotVelocity = engine.RotVelocity + Vector3.new(0, 0.7, 0)
|
|
end
|
|
end
|
|
if (key=="j") and not planedebounce then
|
|
local body = plane.Engine.BodyGyro
|
|
body.maxTorque = Vector3.new(9000, 9000, 9000)
|
|
|
|
local position = engine.CFrame * Vector3.new(0, 0.5, -4)
|
|
local dir = position - engine.Position
|
|
|
|
dir = computeDirection(dir)
|
|
|
|
local spawnPos = engine.Position
|
|
|
|
local pos = spawnPos + (dir * 8)
|
|
|
|
body.cframe = CFrame.new(pos, pos + dir)
|
|
wait(.2)
|
|
body.maxTorque = Vector3.new(0, 0, 0)
|
|
end
|
|
if (key=="l") and planedebounce == false then
|
|
local body = plane.Engine.BodyGyro
|
|
body.maxTorque = Vector3.new(9000, 0, 0)
|
|
local frame = plane:FindFirstChild("OriginCFrame")
|
|
if frame ~= nil then
|
|
body.cframe = frame.Value
|
|
end
|
|
wait(0.1)
|
|
body.maxTorque = Vector3.new(0, 0, 0)
|
|
end
|
|
if (key=="u") and planedebounce == false then
|
|
local body = plane.Engine.BodyGyro
|
|
body.maxTorque = Vector3.new(9000, 9000, 9000)
|
|
|
|
local position = engine.CFrame * Vector3.new(0, -0.5, -4)
|
|
local dir = position - engine.Position
|
|
|
|
dir = computeDirection(dir)
|
|
|
|
local spawnPos = engine.Position
|
|
|
|
local pos = spawnPos + (dir * 8)
|
|
|
|
body.cframe = CFrame.new(pos, pos + dir)
|
|
wait(.2)
|
|
body.maxTorque = Vector3.new(0, 0, 0)
|
|
end
|
|
if (key=="g") and planedebounce == false and stuntdebounce == false then
|
|
planedebounce = true
|
|
stuntdebounce = true
|
|
plane.Parent.Stunt.Value = 1
|
|
local body = plane.Engine.BodyGyro
|
|
body.maxTorque = Vector3.new(9000, 9000, 9000)
|
|
|
|
local currentframe = plane.Engine.CFrame
|
|
|
|
for i = 1,6 do
|
|
body.cframe = plane.Engine.CFrame * CFrame.fromEulerAnglesXYZ(0, 0, 30)
|
|
wait(.2)
|
|
end
|
|
|
|
body.cframe = currentframe
|
|
wait(.6)
|
|
|
|
body.maxTorque = Vector3.new(0, 0, 0)
|
|
planedebounce = false
|
|
plane.Parent.Stunt.Value = 0
|
|
wait(3)
|
|
stuntdebounce = false
|
|
end
|
|
if (key=="t") and planedebounce == false and stuntdebounce == false then
|
|
planedebounce = true
|
|
stuntdebounce = true
|
|
plane.Parent.Stunt.Value = 1
|
|
local body = plane.Engine.BodyGyro
|
|
body.maxTorque = Vector3.new(9000, 9000, 9000)
|
|
|
|
local currentframe = plane.Engine.CFrame
|
|
local valy = 30
|
|
local valz = 30
|
|
|
|
for i = 1,8 do
|
|
body.cframe = currentframe * CFrame.fromEulerAnglesXYZ(0, valy, valz)
|
|
valy = valy +50
|
|
valz = valz +100
|
|
wait(.1)
|
|
end
|
|
|
|
body.cframe = currentframe * CFrame.fromEulerAnglesXYZ(0, 600, 0)
|
|
|
|
wait(.5)
|
|
|
|
body.maxTorque = Vector3.new(0, 0, 0)
|
|
planedebounce = false
|
|
plane.Parent.Stunt.Value = 0
|
|
wait(4)
|
|
stuntdebounce = false
|
|
end
|
|
end
|
|
end
|
|
|
|
spawn(function ()
|
|
local iconOverride = tool:WaitForChild("IconOverride")
|
|
while wait(.25) do
|
|
local isToolInactive = true
|
|
local char = tool.Parent
|
|
if char and char:IsA("Model") then
|
|
local plane = findPlane(char)
|
|
if plane then
|
|
if plane.Parts.Engine:FindFirstChild("FlyScript") then
|
|
isToolInactive = false
|
|
end
|
|
end
|
|
end
|
|
iconOverride.Parent = isToolInactive and tool or nil
|
|
end
|
|
end)
|
|
|
|
local keyEvent = tool:WaitForChild("KeyEvent",99999)
|
|
|
|
local function onKeyEvent(key,down)
|
|
if down then
|
|
onKeyDown(key)
|
|
end
|
|
end
|
|
|
|
tool.Activated:Connect(onActivated)
|
|
tool.Deactivated:Connect(onDeactivated)
|
|
keyEvent.Event:Connect(onKeyEvent) |