local function OnExplosionHit(hitPart, hitDistance, blastCenter)
	local character, humanoid = FindCharacterAncestor(hitPart.Parent)
	
	print(hitPart.Name)	
	
	if hitPart.Name == "CenterPart" then return false end
	
	if humanoid and humanoid.Health > 0 then
		if hitPart.Name == 'HumanoidRootPart' then
			humanoid:TakeDamage(100)
		end
	elseif hitPart.Parent:FindFirstChild("CannonballHit") ~= nil then
		print("Found Function")
		print(tonumber(hitPart.Name))	
		if tonumber(hitPart.Name) ~= nil then
			if hitPart.Parent.CannonballHit:Invoke( tonumber(hitPart.Name), script:FindFirstChild('Damage').Value ) then
				hitPart:BreakJoints()
				local blastForce = Instance.new('BodyForce', hitPart)
				blastForce.force = (hitPart.Position - blastCenter).unit * script:FindFirstChild('BlastForce').Value * hitPart:GetMass()
				game.Debris:AddItem(blastForce, 0.1)
			end
		end
	end
end

cannonball.Touched:connect(function(other)
	local explosion = Instance.new("Explosion")
	explosion.BlastPressure = 0
	explosion.ExplosionType = Enum.ExplosionType.NoCraters
	explosion.BlastRadius = 1
	explosion.Position = cannonball.Position	
	explosion.Parent = cannonball
	
	local connection = explosion.Hit:connect(function(hitPart, hitDistance) print(hitPart.Name) OnExplosionHit(hitPart, hitDistance, explosion.Position) end)
	wait(.1)
	cannonball:Destroy()
end)

When the cannonball hits a part, even one I deliberately renamed to test it out. It always prints the name "Part" and the parent is always "workspace" even if the part is in a model. I have no idea why it is doing this? If anyone can point out what I'm doing wrong I would appreciate it.