As the title implies, my game involves shooting bullets that bounce off of walls. Below is an excerpt from the script that is supposed to make it bounce; it is the code that runs once the bullet hits a wall. But when the bullet reaches the wall, it doesn't bounce; the Speed (the name of a BodyVelocity within the bullet that powers its movement) is deleted, causing the bullet to fall down and through the world. Why in the world is this?
script.Parent.Speed.Velocity = Vector3.new(0, 0, 0) --Stop the bullet from traveling any further. if script.Touched.Horizontal.Value == true then --Calculating the angle that the bullet traveled at so that it can bounce off the wall at the same angle. c = {a.X, b.Z} else c = {b.X, a.Z} end disA = math.sqrt(((c[1]-a.X)^2)+((c[2]-a.Z)^2)) disB = math.sqrt(((c[1]-b.X)^2)+((c[2]-b.Z)^2)) theta = math.atan(disB/disA) --This math isn't really important, don't worry... Just think of theta as the angle that has been calculated (in radians). newDirection = Instance.new("Part", game.Workspace) --Making a new part that holds the direction that the bullet is supposed to face after bouncing off. newDirection.Name = "Vector" newDirection.Size = Vector3.new(.75, .75, .75) newDirection.Anchored = true newDirection.CanCollide = false newDirection.Position = Vector3.new(script.Parent.Position.X, script.Parent.Position.Y + 5, script.Parent.Position.Z) --Placing it 5 studs above the actual bullet. newDirection.Transparency = 1 newDirection.Rotation = script.Parent.Rotation --Setting the rotation of the part to be the same as the bullet so that it can be rotated further with theta. if script.Touched.Horizontal.Value == true then if a.X < b.X then newDirection.CFrame = newDirection.CFrame*CFrame.fromEulerAnglesXYZ(0, theta, 0) else newDirection.CFrame = newDirection.CFrame*CFrame.fromEulerAnglesXYZ(0, -theta, 0) --Depending on the direction that the bullet hit the wall in, it'll bounce off in that direction. end else if a.Y < b.Y then newDirection.CFrame = newDirection.CFrame*CFrame.fromEulerAnglesXYZ(0, theta, 0) elseif a.Y > b.Y then newDirection.CFrame = newDirection.CFrame*CFrame.fromEulerAnglesXYZ(0, -theta, 0) end end wait() script.Parent.Speed.Velocity = 20*(newDirection.CFrame.lookVector.Unit) --This is the part that messes up. When I run the script, the Speed (a bodyvelocity) is just deleted and the bullet falls through the world and is deleted. I have no idea why. script.Origin.Value = b --Setting a new A in the event that the bullet bounces off another wall. newDirection:Destroy() end end --Please don't go off saying that I put in too many ends; I said in the premise of this question that this is an excerpt. The entire script is not shown. I know for certain that the amount of ends is proportionate to the if statements.