i am trying to make a function that "dusts" a player (think infinity war) when called on a player, and it has a function inside it that dusts a single part, which is used in a for loop to dust every part, i cant dust them without using spawn() or else the dusting will take very long, the DustPart(Part) function is being called via spawn(DustPart)(v), but DustPart thinks v is a number when it an instance?
function DustPlayer(Victim) local PartToDust local function DustPart(Part) local GrainyParticles = Instance.new("ParticleEmitter") GrainyParticles.EmissionDirection = Enum.NormalId.Left GrainyParticles.Lifetime = NumberRange.new(1) GrainyParticles.Rate = 50 GrainyParticles.Rotation = NumberRange.new(-360,360) GrainyParticles.RotSpeed = NumberRange.new(-360,360) GrainyParticles.Speed = NumberRange.new(5) GrainyParticles.Size = NumberSequence.new(2) GrainyParticles.Acceleration = Vector3.new(-15,10,0) GrainyParticles.Color = ColorSequence.new(Color3.fromRGB(111,98,92)) GrainyParticles.LightInfluence = 1 GrainyParticles.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0,1,0), NumberSequenceKeypoint.new(0.15,0.1,0), NumberSequenceKeypoint.new(0.5,0.7,0), NumberSequenceKeypoint.new(1,1,0) }) GrainyParticles.ZOffset = 0.1 GrainyParticles.Texture = "rbxassetid://363275192" GrainyParticles.Parent = Part local SoftParticles = Instance.new("ParticleEmitter") SoftParticles.EmissionDirection = Enum.NormalId.Left SoftParticles.Lifetime = NumberRange.new(1) SoftParticles.Rate = 50 SoftParticles.Rotation = NumberRange.new(-360,360) SoftParticles.RotSpeed = NumberRange.new(-360,360) SoftParticles.Speed = NumberRange.new(5) SoftParticles.Size = NumberSequence.new(2) SoftParticles.Acceleration = Vector3.new(-15,10,0) SoftParticles.Color = ColorSequence.new(Color3.fromRGB(158,158,158)) SoftParticles.LightInfluence = 1 SoftParticles.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0,1,0), NumberSequenceKeypoint.new(0.15,0.1,0), NumberSequenceKeypoint.new(0.5,0.7,0), NumberSequenceKeypoint.new(1,1,0) }) SoftParticles.Texture = "rbxassetid://3176154112" SoftParticles.Parent = Part local Tween = TService:Create(Part,DustInfo,DustDict) Tween:Play() wait(2) Part.Transparency = 1 Part.CanCollide = false SoftParticles.Enabled = false GrainyParticles.Enabled = false wait(1) end local Sound = Instance.new("Sound") Sound.PlayOnRemove = true Sound.Volume = 5 Sound.SoundId = Sounds.Dustings[math.random(1,#Sounds.Dustings)] Sound.Parent = Victim.Character.Head Sound:Destroy() for k,v in pairs(Victim.Character:GetChildren()) do if v:IsA("BasePart") then spawn(DustPart)(v) if v.Name == "Head" then v:FindFirstChildOfClass("Decal"):Destroy() end wait(0.5) end if v:IsA("Accoutrement") then v.Handle:FindFirstChildOfClass("SpecialMesh").TextureId = "" DustPart(v.Handle) wait(0.5) end wait() end end
The problem in your script is the way you call your DustPart
function, the format spawn(DustPart)(v)
. v
is actually never passed to the DustPart
function and instead, the first parameter of spawn- namely the delta time - is passed by spawn. You must use anonymous functions to achieve what you need.
To check the behaviour of spawn()
we run a test function without any anonymous functions:
local function test(x) wait(3) print(x) end spawn(test)("Waited 3 seconds!") print("Beginning")
The output we observe is:
03:00:55.491 - [string "local function test(x, y) ..."]:6: attempt to call a nil value -- 3 seconds later 0.031062014207009
The number in the latter print is the delta time, or the time passed since when spawn was called to when the function in it was invoked. A better look at this is through the following script:
local function test(x) print(tick()) wait(3) print(x) end print(tick()) spawn(test) print("Beginning")
We get the values 1560049557.6195
and 1560049557.5887
from our print(tick())
s, on subtracting which we get 0.030799865722656
, very close to our value of x: 0.030203970198272
. Similarly there is a second value passed by spawn, which I don't know well enough to explain.
To quote Seranok from a post:
Spawn calls the function with two arguments: the first being the amount of time which elapsed from when spawn was called to when the function was invoked, and the second being equivalent to elapsedTime() or roughly how long the engine has been running.
The fix to this problem is an easy one once you know what's going wrong, just use an anonymous function while calling the DustPart
function as such:
spawn(function() DustPart(v) end)
That's it from me! I hope this solved your problem, feel free to ask any questions or point out any mistakes in the comments.