the error is ReplicatedStorage.modules.LightningBolt:156: table index is nil
however my lightning bolt exists in it.
the section that the error occurs.
this section
function LightningBolt:Destroy()
ActiveBranches[self._RefIndex] = nil
for i = 1, #self._Parts do
LightningCache:ReturnPart(self._Parts[i])
end
self = nil
end
local BoltPart = Instance.new("Part") --Template primitive that will make up the entire bolt
BoltPart.TopSurface, BoltPart.BottomSurface = 0, 0
BoltPart.Anchored, BoltPart.CanCollide = true, false
BoltPart.Locked, BoltPart.CastShadow = true, false
BoltPart.CanTouch, BoltPart.CanQuery = false, false
BoltPart.Shape = "Cylinder"
BoltPart.Name = "BoltPart"
BoltPart.Material = Enum.Material.Neon
BoltPart.Color = Color3.new(1, 1, 1)
BoltPart.Transparency = 1
local PartCache = require(script.Parent:WaitForChild("PartCache"))
local LightningCache = PartCache.new(BoltPart, PARTS_IN_CACHE)
LightningCache:SetCacheParent(parent)
--*
local function CubicBezier(PercentAlongBolt, p0, p1, p2, p3)
return p0 * (1 - PercentAlongBolt) ^ 3
+ p1 * 3 * PercentAlongBolt * (1 - PercentAlongBolt) ^ 2
+ p2 * 3 * (1 - PercentAlongBolt) * PercentAlongBolt ^ 2
+ p3 * PercentAlongBolt ^ 3
end
local xInverse = CFrame.lookAt(Vector3.new(), Vector3.new(1, 0, 0)):inverse()
local offsetAngle = math.cos(math.rad(90))
local ActiveBranches = {} --Contains all LightningBolt instances
local LightningBolt = {} --Define new class
LightningBolt.__type = "LightningBolt"
LightningBolt.__index = LightningBolt
--Small tip: You don't need to use actual Roblox Attachments below. You can also create "fake" ones as follows:
--[[
local A1, A2 = {}, {}
A1.WorldPosition, A1.WorldAxis = chosenPos1, chosenAxis1
A2.WorldPosition, A2.WorldAxis = chosenPos2, chosenAxis2
local NewBolt = LightningBolt.new(A1, A2, 40)
--]]
function LightningBolt.new(Attachment0, Attachment1, PartCount)
local self = setmetatable({}, LightningBolt)
PartCount = PartCount or 30
--*Main (default) Properties--
--Bolt Appearance Properties
self.Enabled = true --Hides bolt without removing any parts when false
self.Attachment0, self.Attachment1 = Attachment0, Attachment1 --Bolt originates from Attachment0 and ends at Attachment1
self.CurveSize0, self.CurveSize1 = 0, 0 --Works similarly to roblox beams. See https://dk135eecbplh9.cloudfront.net/assets/blt160ad3fdeadd4ff2/BeamCurve1.png
self.MinRadius, self.MaxRadius = 0, 2.4 --Governs the amplitude of fluctuations throughout the bolt
self.Frequency = 1 --Governs the frequency of fluctuations throughout the bolt. Lower this to remove jittery-looking lightning
self.AnimationSpeed = 7 --Governs how fast the bolt oscillates (i.e. how fast the fluctuating wave travels along bolt)
self.Thickness = 1 --The thickness of the bolt
self.MinThicknessMultiplier, self.MaxThicknessMultiplier = 0.2, 1 --Multiplies Thickness value by a fluctuating random value between MinThicknessMultiplier and MaxThicknessMultiplier along the Bolt
--Bolt Kinetic Properties
--[[
Allows for fading in (or out) of the bolt with time. Can also create a "projectile" bolt
Recommend setting AnimationSpeed to 0 if used as projectile (for better aesthetics)
Works by passing a "wave" function which travels from left to right where the wave height represents opacity (opacity being 1 - Transparency)
See https://www.desmos.com/calculator/hg5h4fpfim to help customise the shape of the wave with the below properties
--]]
self.MinTransparency, self.MaxTransparency = 0, 1
self.PulseSpeed = 2 --Bolt arrives at Attachment1 1/PulseSpeed seconds later
self.PulseLength = 1000000
self.FadeLength = 0.2
self.ContractFrom = 0.5 --Parts shorten or grow once their Transparency exceeds this value. Set to a value above 1 to turn effect off. See https://imgur.com/OChA441
--Bolt Color Properties
self.Color = Color3.new(1, 1, 1) --Can be a Color3 or ColorSequence
self.ColorOffsetSpeed = 3 --Sets speed at which ColorSequence travels along Bolt
--*
--*Advanced Properties--
--[[
Allows you to pass a custom space curve for the bolt to be defined along
Constraints:
-First input passed must be a parameter representing PercentAlongBolt between values 0 and 1
Example: self.SpaceCurveFunction = VivianiCurve(PercentAlongBolt)
--]]
self.SpaceCurveFunction = CubicBezier
--[[
Allows you to pass a custom opacity profile which controls the opacity along the bolt
Constraints:
-First input passed must be a parameter representing PercentAlongBolt between values 0 and 1
-Second input passed must be a parameter representing TimePassed since instantiation
Example: self.OpacityProfileFunction = MovingSineWave(PercentAlongBolt, TimePassed)
Note: You may want to set self.ContractFrom to a value above 1 if you pass a custom opacity profile as contraction was designed to work with DiscretePulse
--]]
self.OpacityProfileFunction = DiscretePulse
--[[
Allows you to pass a custom radial profile which controls the radius of control points along the bolt
Constraints:
-First input passed must be a parameter representing PercentAlongBolt between values 0 and 1
--]]
self.RadialProfileFunction = ExtrudeCenter
--*
--! Private vars are prefixed with an underscore (e.g. self._Parts) and should not be changed manually
self._Parts = {} --The BoltParts which make up the Bolt
for i = 1, PartCount do
self._Parts[i] = LightningCache:GetPart()
end
self._PartsHidden = false
self._DisabledTransparency = 1
self._StartT = clock()
self._RanNum = math.random() * 100
self._RefIndex = #ActiveBranches + 1
ActiveBranches[self._RefIndex] = self
return self
end
function LightningBolt:Destroy()
ActiveBranches[self._RefIndex] = nil
for i = 1, #self._Parts do
LightningCache:ReturnPart(self._Parts[i])
end
self = nil
end
--Calls Destroy() after TimeLength seconds where a dissipating effect takes place in the meantime
function LightningBolt:DestroyDissipate(TimeLength, Strength)
TimeLength = TimeLength or 0.2
Strength = Strength or 0.5
local DissipateStartT = clock()
local start, mid, goal = self.MinTransparency, self.ContractFrom, self.ContractFrom
+ 1 / (#self._Parts * self.FadeLength)
local StartRadius = self.MaxRadius
local StartMinThick = self.MinThicknessMultiplier
local DissipateLoop
DissipateLoop = RunService.Heartbeat:Connect(function()
local TimeSinceDissipate = clock() - DissipateStartT
self.MinThicknessMultiplier = StartMinThick + (-2 - StartMinThick) * TimeSinceDissipate / TimeLength
if TimeSinceDissipate < TimeLength * 0.4 then
local interp = (TimeSinceDissipate / (TimeLength * 0.4))
self.MinTransparency = start + (mid - start) * interp
elseif TimeSinceDissipate < TimeLength then
local interp = ((TimeSinceDissipate - TimeLength * 0.4) / (TimeLength * 0.6))
self.MinTransparency = mid + (goal - mid) * interp
self.MaxRadius = StartRadius * (1 + Strength * interp)
self.MinRadius = self.MinRadius + (self.MaxRadius - self.MinRadius) * interp
else
--Destroy Bolt
local TimePassed = clock() - self._StartT
local Lifetime = (self.PulseLength + 1) / self.PulseSpeed
if TimePassed < Lifetime then --prevents Destroy()ing twice
self:Destroy()
end
--Disconnect Loop
DissipateLoop:Disconnect()
DissipateLoop = nil
end
end)
end
function LightningBolt:_UpdateGeometry(
BPart,
PercentAlongBolt,
TimePassed,
ThicknessNoiseMultiplier,
PrevPoint,
NextPoint
)
--Compute opacity for this particular section
local MinOpa, MaxOpa = 1 - self.MaxTransparency, 1 - self.MinTransparency
local Opacity = self.OpacityProfileFunction(
PercentAlongBolt,
TimePassed,
self.PulseSpeed,
self.PulseLength,
self.FadeLength,
MinOpa,
MaxOpa
)
--Compute thickness for this particular section
local Thickness = self.Thickness * ThicknessNoiseMultiplier * Opacity
Opacity = Thickness > 0 and Opacity or 0
--Compute + update sizing and orientation of this particular section
local contractf = 1 - self.ContractFrom
local PartsN = #self._Parts
if Opacity > contractf then
BPart.Size = Vector3.new((NextPoint - PrevPoint).Magnitude, Thickness, Thickness)
BPart.CFrame = CFrame.lookAt((PrevPoint + NextPoint) * 0.5, NextPoint) * xInverse
BPart.Transparency = 1 - Opacity
elseif Opacity > contractf - 1 / (PartsN * self.FadeLength) then
local interp = (1 - (Opacity - (contractf - 1 / (PartsN * self.FadeLength))) * PartsN * self.FadeLength)
* (PercentAlongBolt < TimePassed * self.PulseSpeed - 0.5 * self.PulseLength and 1 or -1)
BPart.Size = Vector3.new((1 - math.abs(interp)) * (NextPoint - PrevPoint).Magnitude, Thickness, Thickness)
BPart.CFrame = CFrame.lookAt(
PrevPoint + (NextPoint - PrevPoint) * (math.max(0, interp) + 0.5 * (1 - math.abs(interp))),
NextPoint
)
* xInverse
BPart.Transparency = 1 - Opacity
else
BPart.Transparency = 1
end
end
function LightningBolt:_UpdateColor(BPart, PercentAlongBolt, TimePassed)
if typeof(self.Color) == "Color3" then
BPart.Color = self.Color
else --ColorSequence
local t1 = (self._RanNum + PercentAlongBolt - TimePassed * self.ColorOffsetSpeed) % 1
local keypoints = self.Color.Keypoints
for i = 1, #keypoints - 1 do
if keypoints[i].Time < t1 and t1 < keypoints[i + 1].Time then
BPart.Color = keypoints[i].Value:lerp(
keypoints[i + 1].Value,
(t1 - keypoints[i].Time) / (keypoints[i + 1].Time - keypoints[i].Time)
)
break
end
end
end
end
function LightningBolt:_Disable()
self.Enabled = false
for _, BPart in ipairs(self._Parts) do
BPart.Transparency = self._DisabledTransparency
end
end
debug.profileend()
end)
return LightningBolt
thankyou in advance
