I'm currently working on a game where you can fly a plane. I'm currently trying to implement a system where if the plane collides with a part it checks the speed and if it was going over a certain speed it explodes. I'm controlling the plain using UserInputService and moving it with CFrames. This is all being done in a Local Script. The plane object is a meshPart and planeHitBox is a basePart.
The problem is when I run the code even after colliding with things it doesn't trigger an event, i.e. the print statement doesn't run inside the function. Here's my code:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local plane = workspace.Plane
local startFrame = plane.CFrame
local roll = CFrame.Angles(0,0,0)
local pitch = CFrame.Angles(0,0,0)
local yaw = CFrame.Angles(0,0,0)
local throttle = CFrame.new(0,0,-0.5)
--Throttle Controls
local THROTTLE_SPEED = 0.08
local MAX_THROTTLE = 3
local THROTTLE_DECLERATION = 0.02
--Other Controls
local ROLL_SPEED = 0.1
local PITCH_SPEED = 0.05
local YAW_SPEED = 0.02
--Physic Values
local DRAG = 0.05
local isInput = false
local function breakPlane()
roll = CFrame.Angles(0,0,0)
pitch = CFrame.Angles(0,0,0)
yaw = CFrame.Angles(0,0,0)
throttle = CFrame.new(0,0,0)
plane.Anchored = true
plane.Fire.Enabled = true
plane.Explosion.Position = plane.Position
plane.Explosion.Visible = true
end
ReplicatedStorage.switchView.Event:Connect(function()
local camera = workspace.CurrentCamera
print("Fired")
plane.planeHitBox.Touched:Connect(function()
print("collison")
local throtPos = throttle.Position
print(throtPos)
if throtPos.X > 1 or throtPos.Y > 1 or throtPos.Z >1 then
breakPlane()
end
end)
UIS.InputEnded:Connect(function()
isInput = false
roll = CFrame.Angles(0,0,0)
pitch = CFrame.Angles(0,0,0)
yaw = CFrame.Angles(0,0,0)
end)
UIS.InputBegan:Connect(function(input)
local key = input.KeyCode
local keyC = Enum.KeyCode
isInput = true
repeat
if key == keyC.A then
--Yaw Left
yaw *= CFrame.Angles(0,math.rad(YAW_SPEED),0)
elseif key == keyC.D then
--Yaw Right
yaw *= CFrame.Angles(0,math.rad(-YAW_SPEED),0,0)
elseif key == keyC.W then
--Pitch Down
pitch *= CFrame.Angles(math.rad(-PITCH_SPEED),0,0)
elseif key == keyC.S then
--Pitch Up
pitch *= CFrame.Angles(math.rad(PITCH_SPEED),0,0)
elseif key == keyC.E then
--Roll Right
roll *= CFrame.Angles(0,0,math.rad(-ROLL_SPEED))
elseif key == keyC.Q then
--Roll Left
roll *= CFrame.Angles(0,0,math.rad(ROLL_SPEED))
elseif key == keyC.R then
--Increase Throttle
if throttle.Position.Z > -MAX_THROTTLE then
throttle *= CFrame.new(0,0,-THROTTLE_SPEED)
end
elseif key == keyC.F then
--Decrease Throttle
if throttle.Position.Z <= -0.5 then
throttle *= CFrame.new(0,0,THROTTLE_DECLERATION)
end
end
wait()
until isInput == false
end)
while true do
wait()
camera.CFrame = plane.planeCamera.CFrame
plane.CFrame = plane.CFrame * throttle * pitch * roll * yaw * CFrame.new(0,0,DRAG)
end
end)
All help is appreciated thank you! If you have any questions just comment on this and I'll respond.

2 comments
Touched event is quite wank while managed by the client, sometimes it doesn't fire at all, sometimes it fires too early, etc
By the way, I thought .Event was only for BindableEvents?