Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Object expected, got number when using spawn?

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

1 answer

✓ Accepted answer

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.

Demonstration

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 Solution

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.

1 comment

0

IT WORKED! thanks for your help!

This discussion is preserved as it was. New answers, comments, and votes are closed.