Alright, so this is my script where whenever you jump out of a car (Active = false) then it begins to countdown from 30. The "until" part keeps saying "attempt to index field 'Parent' (a nil value)" when the car (script.Parent) gets destroyed.
script.Parent.VehicleSeat.Active.Changed:connect(function() if script.Parent.VehicleSeat.Active.Value == false then repeat wait(1) script.Parent.Number.Value = script.Parent.Number.Value - 1 script.Parent.Base.Countdown.Number.Text = script.Parent.Number.Value if script.Parent:FindFirstChild("VehicleSeat") == nil then script.Parent:Destroy() elseif script.Parent:FindFirstChild("Number") and script.Parent.Number.Value < 1 then script.Parent:Destroy() end until script.Parent.VehicleSeat.Active.Value == true or script.Parent.VehicleSeat == nil end end)
This happens because once the car is removed, the parent is no longer available. But how do I make the repeat statement stop so I don't get any errors?
Here's what I recommend you do.
local carDestroyed = false script.Parent.VehicleSeat.Active.Changed:connect(function() if script.Parent.VehicleSeat.Active.Value == false then repeat wait(1) script.Parent.Number.Value = script.Parent.Number.Value - 1 script.Parent.Base.Countdown.Number.Text = script.Parent.Number.Value if script.Parent:FindFirstChild("VehicleSeat") == nil then script.Parent:Destroy() carDestroyed = true elseif script.Parent:FindFirstChild("Number") and script.Parent.Number.Value < 1 then script.Parent:Destroy() carDestroyed = true end until carDestroyed == true end end)
So how this works is we create a variable called carDestroyed
and we set it to false since the car has not been destroyed yet. In your loop we make it repeat until our variable carDestroyed
is true. Now, in order for it to become true, we set it to true once we destroy the car. Since we are not referencing the car that got destroyed you shouldn't then get any errors. I hope this helps!
My revised answer:
The problem was, you had a "repeat" loop that would still try to look for things after it had destroyed them.
With as little modification to your code as possible, I seem to have been able to rectify the problem by using a "While" loop- "while VehicleSeat.Active == true do".
It's still not the best way of handling the countdown, but it's the best considering the NumberValues are there for a reason (probably context outside of the code you've posted)
This is the code to my best-guess solution. Give it a shot.
script.Parent.VehicleSeat.Active.Changed:connect(function() if script.Parent.VehicleSeat.Active.Value == false then while script.Parent.VehicleSeat.Active.Value == false do wait(1) if script.Parent.VehicleSeat.Active.Value == false then -- just another clumsy failsafe in case the value changes within that 1 second tick. if script.Parent.Number.Value == 0 then script.Parent:Destroy() else -- By doing the counting down in an "else" statement, we make sure we never have to try and count down a numbervalue that no longer exists. script.Parent.Number.Value = script.Parent.Number.Value - 1 script.Parent.Base.Countdown.Number.Text = script.Parent.Number.Value end end end else script.Parent.Number.Value = 30 -- if active has been changed to "true", it resets your countdown. end end)
I'll edit this answer if I manage to create a countdown that reacts instantly to the change of VehicleSeat.Active.
Hope this helps!