The brick, "LightExplosion" is a ball part that is fired with a laser and then rapidly expands to its size. The issue is when it resizes it goes around blocks instead of cframing into them and it only happens with the onTouch function. When the function is removed it works fine. How would I fix the function to where it doesn't force the ball to go over the designated part and instead half into it? Here's the code causing the problem:

-- Adds a repulsive force to anything this object touches

local Debris = game:GetService('Debris')

 
local CharacterToIgnore = script:WaitForChild('CharacterToIgnore').Value

 

local MAGNITUDE = 3E4

local TIME_OF_FORCE = 0.2

 
local Part = script.Parent
Part.Touched:connect(function(other)
	Part.CanCollide= false
	Part.Anchored = true

 --Variable goes here!

    if other.Parent == CharacterToIgnore or (other.Parent and other.Parent.Parent == CharacterToIgnore) then return end

    if not other.Anchored then

       -- local punchSound = script:FindFirstChild('PunchSound')

        --if punchSound then punchSound:Play() end

        local direction = (other.Position - Part.Position).unit

        local bodyForce = Instance.new('BodyForce')

        bodyForce.force = MAGNITUDE * direction-- Adds a repulsive force to anything this object touches

local Debris = game:GetService('Debris')

 
local CharacterToIgnore = script:WaitForChild('CharacterToIgnore').Value

 

local MAGNITUDE = 3E4

local TIME_OF_FORCE = 0.2

 
local Part = script.Parent
Part.Touched:connect(function(other)
	Part.CanCollide= false
	Part.Anchored = true

 --Variable goes here!

    if other.Parent == CharacterToIgnore or (other.Parent and other.Parent.Parent == CharacterToIgnore) then return end

    if not other.Anchored then

       -- local punchSound = script:FindFirstChild('PunchSound')

        --if punchSound then punchSound:Play() end

        local direction = (other.Position - Part.Position).unit

        local bodyForce = Instance.new('BodyForce')

        bodyForce.force = MAGNITUDE * direction

        bodyForce.Parent = other

        Debris:AddItem(bodyForce, TIME_OF_FORCE)

    end

end)


        bodyForce.Parent = other

        Debris:AddItem(bodyForce, TIME_OF_FORCE)

    end

end)

Here's the code where the ball is actually created:

local tool = script.Parent
local player = game:GetService("Players").LocalPlayer

local beam = Instance.new("Part", workspace)


tool.Equipped:connect(function(mouse)
	print("Tool equipped!")
 	--wait(1)
	mouse.Button1Down:connect(function()
		
		script.Disabled = true
		script.Parent.Sound:Play()
		print("READY A")
		print("Mouse pressed!")
		
		local ray = Ray.new(tool.Handle.CFrame.p, (mouse.Hit.p - tool.Handle.CFrame.p).unit * 300)
		local part, position = workspace:FindPartOnRay(ray, player.Character, false, true)
 		
		
		beam.BrickColor = BrickColor.Yellow()
		beam.FormFactor = "Custom"
		beam.Material = "Neon"
		beam.Transparency = 0.25
		beam.Anchored = true
		beam.Locked = true
		beam.CanCollide = false
		beam.Shape = "Ball"
		beam.Name = "LightExplosion"
		beam.Anchored = true
		
		
		
		
		
		
		
 
		local distance = (tool.Handle.CFrame.p - position).magnitude
		beam.Size = Vector3.new(1, 1, 1)
		beam.CFrame = CFrame.new(tool.Handle.CFrame.p, position) * CFrame.new(0, 0, -distance / 1)
	    beam.Size = Vector3.new(2, 2, 2)
	local scriptCopy = game.ReplicatedStorage.RepelScript:Clone()
		scriptCopy.Parent = game.Workspace.LightExplosion
	beam.BrickColor = BrickColor.new("Orange")
		wait(.05)
	beam.Size = Vector3.new(3, 3, 3)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(4, 4, 4)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(5, 5, 5)
	beam.BrickColor = BrickColor.Yellow()
	wait(.05)
	beam.Size = Vector3.new(6, 6, 6)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)--	
	beam.Size = Vector3.new(7, 7, 7)
	beam.BrickColor = BrickColor.Yellow()
	wait(.05)
	beam.Size = Vector3.new(8, 8, 8)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(9, 9, 9)
	beam.BrickColor = BrickColor.Yellow()
	wait(.05)
	beam.Size = Vector3.new(10, 10, 10)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(11, 11, 11)
	beam.BrickColor = BrickColor.Yellow()
	wait(.05)
	beam.Size = Vector3.new(12, 12, 12)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(13, 13, 13)
	beam.BrickColor = BrickColor.Yellow()
	wait(.05)
	beam.Size = Vector3.new(14, 14, 14)
	beam.BrickColor = BrickColor.new("Orange")
	wait(.05)
	beam.Size = Vector3.new(15, 15, 15)
	beam.BrickColor = BrickColor.Yellow()
	
	
		
 		
		
 		game:GetService("Debris"):AddItem(beam, 1)
		if part then
			local humanoid = part.Parent:FindFirstChild("Humanoid")
 
			if not humanoid then
				humanoid = part.Parent.Parent:FindFirstChild("Humanoid")
			end
 
			if humanoid then
				humanoid:TakeDamage(30)
			end
			script.Parent.Reload.Disabled = false
		   
			
		end
		
	end)
end)

--script.Parent.Reload.Disabled = false
		--script.Disabled = true