Solved this by creating a table for each player, before it does damage I do HitDetection[Player] = {}

I'm using explosions for hit detection, but it does damage for each body part the player has, which obviously makes it do way too much damage. Instead of creating an ugly system that detects when a "hit" value has been changed, or lock the part to only hitting 1 player at a time, I'd like to try and do it with tables.

script i use for damage, parts where im having issues have been commented on

local HitTable = {}
local a = HitDetectionModule.new(Waterbomb, Player, true) --true = debounce
		local b = a:SetUp(1, false) -- 1 = number of repeats
		Waterbomb.Size = Vector3.new(SizeCharge[Player])
		Waterbomb.Parent = Player.Character.Bin
		b.Event:Connect(function(Hit)
			local Explosion = Instance.new("Explosion")
			Explosion.Position = Waterbomb.Position
			CurrentSkill[Player] = "Waterbomb Explode"
			Storage.Remotes.General.Effect:FireAllClients(Player,CurrentSkill[Player],Waterbomb.CFrame, SizeCharge[Player])
			Waterbomb:Destroy()
			Explosion.Visible = false
			Explosion.BlastPressure = 0
			Explosion.BlastRadius = SizeCharge[Player] + 2
			if Explosion.BlastRadius < 10 then Explosion.BlastRadius = 10 end
			Explosion.DestroyJointRadiusPercent = 0
			Explosion.ExplosionType = Enum.ExplosionType.NoCraters
			Explosion.Parent = workspace
			local PlayerHitTable = HitTable[Player]
			Explosion.Hit:Connect(function(Part)
				if Part.Parent ~= Player.Character and Part.Parent:FindFirstChild("Humanoid") and not Part.Parent:FindFirstChild("ForceField") then
					--table.insert(HitTable[Player], Part.Parent) -- this gives an error (table expected, got nil)
					table.insert(HitTable, Part.Parent) -- this works, but I need it to keep track for each player
					local Damage = Player.Stats.Level.Value * 1.8 + Power[Player] 
					Part.Parent.Humanoid:TakeDamage(Damage)
					local BVV = Instance.new("BodyVelocity")
					BVV.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
					BVV.Velocity = Vector3.new(math.random(5,10),SizeCharge[Player]+ 20,math.random(5,10))
					BVV.Parent = Part.Parent:FindFirstChild("HumanoidRootPart")
					delay(.8, function() BVV:Destroy() end)
					print(Damage)
				end
			end)
		end)

thanks for reading!