This is the module section, however tit says atttempt to index nil with number
--Adds sparks effect to a Lightning Bolt local LightningBolt = require(script.Parent) local ActiveSparks = {} local rng = Random.new() local LightningSparks = {} LightningSparks.__index = LightningSparks function LightningSparks.new(LightningBolt, MaxSparkCount) local self = setmetatable({}, LightningSparks) --Main (default) properties-- self.Enabled = true --Stops spawning sparks when false self.LightningBolt = LightningBolt --Bolt which sparks fly out of self.MaxSparkCount = MaxSparkCount or 10 --Max number of sparks visible at any given instance self.MinSpeed, self.MaxSpeed = 4, 6 --Min and max PulseSpeeds of sparks self.MinDistance, self.MaxDistance = 3, 6 --Governs how far sparks travel away from main bolt self.MinPartsPerSpark, self.MaxPartsPerSpark = 8, 10 --Adjustable -- self.SparksN = 0 self.SlotTable = {} self.RefIndex = #ActiveSparks + 1 ActiveSparks[self.RefIndex] = self return self end function LightningSparks:Destroy() ActiveSparks[self.RefIndex] = nil for i, v in pairs(self.SlotTable) do if v.Parts[1].Parent == nil then self.SlotTable[i] = nil --Removes reference to prevent memory leak end end self = nil end function RandomVectorOffset(v, maxAngle) --returns uniformly-distributed random unit vector no more than maxAngle radians away from v return (CFrame.lookAt(Vector3.new(), v)*CFrame.Angles(0, 0, rng:NextNumber(0, 2*math.pi))*CFrame.Angles(math.acos(rng:NextNumber(math.cos(maxAngle), 1)), 0, 0)).LookVector end game:GetService("RunService").Heartbeat:Connect(function () for _, ThisSpark in pairs(ActiveSparks) do if ThisSpark.Enabled == true and ThisSpark.SparksN < ThisSpark.MaxSparkCount then local Bolt = ThisSpark.LightningBolt if Bolt.Parts[1] == nil or Bolt.Parts[1].Parent == nil then ThisSpark:Destroy() return end local BoltParts = Bolt.Parts local BoltPartsN = #BoltParts local opaque_parts = {} for part_i = 1, #BoltParts do --Fill opaque_parts table if BoltParts[part_i].Transparency < 0.3 then --minimum opacity required to be able to generate a spark there opaque_parts[#opaque_parts + 1] = (part_i - 0.5) / BoltPartsN end end local minSlot, maxSlot if #opaque_parts ~= 0 then minSlot, maxSlot = math.ceil(opaque_parts[1]*ThisSpark.MaxSparkCount), math.ceil(opaque_parts[#opaque_parts]*ThisSpark.MaxSparkCount) end for _ = 1, rng:NextInteger(1, ThisSpark.MaxSparkCount - ThisSpark.SparksN) do if #opaque_parts == 0 then break end local available_slots = {} for slot_i = minSlot, maxSlot do --Fill available_slots table if ThisSpark.SlotTable[slot_i] == nil then --check slot doesn't have existing spark available_slots[#available_slots + 1] = slot_i end end if #available_slots ~= 0 then local ChosenSlot = available_slots[rng:NextInteger(1, #available_slots)] local localTrng = rng:NextNumber(-0.5, 0.5) local ChosenT = (ChosenSlot - 0.5 + localTrng)/ThisSpark.MaxSparkCount local dist, ChosenPart = 10, 1 for opaque_i = 1, #opaque_parts do local testdist = math.abs(opaque_parts[opaque_i] - ChosenT) if testdist < dist then dist, ChosenPart = testdist, math.floor((opaque_parts[opaque_i]*BoltPartsN + 0.5) + 0.5) end end local Part = BoltParts[ChosenPart] --Make new spark-- local A1, A2 = {}, {} A1.WorldPosition = Part.CFrame.Position + localTrng*Part.CFrame.UpVector*Part.Size.Y A2.WorldPosition = A1.WorldPosition + RandomVectorOffset(Part.CFrame.UpVector, math.pi/4)*rng:NextNumber(ThisSpark.MinDistance, ThisSpark.MaxDistance) A1.WorldAxis = (A2.WorldPosition - A1.WorldPosition).Unit A2.WorldAxis = A1.WorldAxis local NewSpark = LightningBolt.new(A1, A2, rng:NextInteger(ThisSpark.MinPartsPerSpark, ThisSpark.MaxPartsPerSpark)) --NewSpark.MaxAngleOffset = math.rad(70) NewSpark.MinRadius, NewSpark.MaxRadius = 0, 0.8 NewSpark.AnimationSpeed = 0 NewSpark.Thickness = Part.Size.X / 1.2 NewSpark.MinThicknessMultiplier, NewSpark.MaxThicknessMultiplier = 1, 1 NewSpark.PulseLength = 0.5 NewSpark.PulseSpeed = rng:NextNumber(ThisSpark.MinSpeed, ThisSpark.MaxSpeed) NewSpark.FadeLength = 0.25 local cH, cS, cV = Color3.toHSV(Part.Color3) NewSpark.Color = Color3.fromHSV(cH, 0.5, cV) ThisSpark.SlotTable[ChosenSlot] = NewSpark -- end end end --Update SparksN-- local slotsInUse = 0 for i, v in pairs(ThisSpark.SlotTable) do if v.Parts[1].Parent ~= nil then slotsInUse = slotsInUse + 1 else ThisSpark.SlotTable[i] = nil --Removes reference to prevent memory leak end end ThisSpark.SparksN = slotsInUse -- end end) return LightningSparks