i have a bowling game and the balls that i used wont stay in the lane and bounce akwardly to the sides of the aisle
Tool = script.Parent VELOCITY = 100 -- constant local Pellet = Instance.new("Part") Pellet.Name = "Roll" Pellet.Locked = true Pellet.BackSurface = 0 Pellet.BottomSurface = 0 Pellet.FrontSurface = 0 Pellet.LeftSurface = 0 Pellet.RightSurface = 0 Pellet.TopSurface = 0 Pellet.Shape = 0 Pellet.Reflectance = 0.1 Pellet.Friction = 0 Pellet.Size = Vector3.new(2,2,2) Pellet.BrickColor = BrickColor.new("Navy blue") script.Parent.PelletScript:clone().Parent = Pellet script.Parent.BodyForce:clone().Parent = Pellet function fire(mouse_pos) Tool.Handle.SlingshotSound:play() -- find player's head pos local vCharacter = Tool.Parent local vPlayer = game.Players:playerFromCharacter(vCharacter) local head = vCharacter:findFirstChild("Head") if head == nil then return end local dir = mouse_pos - head.Position dir = computeDirection(dir) local launch = head.Position + 2 * dir local delta = mouse_pos - launch local dy = delta.y local new_delta = Vector3.new(delta.x, 0, delta.z) delta = new_delta local dx = delta.magnitude local unit_delta = delta.unit -- acceleration due to gravity in RBX units local g = (-9.81 * 20) local theta = computeLaunchAngle( dx, dy, g) local vy = math.sin(theta) local xz = math.cos(theta) local vx = unit_delta.x * xz local vz = unit_delta.z * xz local missile = Pellet:clone() missile.Position = launch missile.Velocity = Vector3.new(vx,vy,vz) * VELOCITY missile.PelletScript.Disabled = false local creator_tag = Instance.new("ObjectValue") creator_tag.Value = vPlayer creator_tag.Name = "creator" creator_tag.Parent = missile missile.Parent = game.Workspace end function computeLaunchAngle(dx,dy,grav) -- arcane -- http://en.wikipedia.org/wiki/Trajectory_of_a_projectile local g = math.abs(grav) local inRoot = (VELOCITY*VELOCITY*VELOCITY*VELOCITY) - (g * ((g*dx*dx) + (2*dy*VELOCITY*VELOCITY))) if inRoot <= 0 then return .25 * math.pi end local root = math.sqrt(inRoot) local inATan1 = ((VELOCITY*VELOCITY) + root) / (g*dx) local inATan2 = ((VELOCITY*VELOCITY) - root) / (g*dx) local answer1 = math.atan(inATan1) local answer2 = math.atan(inATan2) if answer1 < answer2 then return answer1 end return answer2 end 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 Tool.Enabled = true function onActivated() if not Tool.Enabled then return end Tool.Enabled = false local character = Tool.Parent; local humanoid = character.Humanoid if humanoid == nil then print("Humanoid not found") return end local targetPos = humanoid.TargetPoint fire(targetPos) wait(5) Tool.Enabled = true end script.Parent.Activated:connect(onActivated)