Is :FindFirstChild() working properly here?

So my problem is that whenever the code shown below runs through, it’s supposed reset the player’s walkspeed if it is greater than what it’s supposed to be. However, when I try to say “and not check”, it still runs the code anyway. Is :FindFirstChild() running properly here and I should use a different technique, or is something else happening.

function module.ChangeSpeed(hitCharacter, Duration, Type, Multiplier)

	local hitHumanoid = hitCharacter:FindFirstChild("Humanoid")
	local walkSpeedStatMax = hitCharacter:FindFirstChild("Stats").SpeedStat.BaseSpeedStat.Value
	local curSpeedStat = hitCharacter:FindFirstChild("Stats").SpeedStat
	
	if Type == "SpeedDown" then
		local particleEmitter = game.ReplicatedStorage.EffectImages.SpeedEmitter:Clone()
		particleEmitter.Parent = workspace
		particleEmitter.Size = Vector3.new(hitCharacter.HumanoidRootPart.Size.X, hitCharacter.HumanoidRootPart.Size.Y, hitCharacter.HumanoidRootPart.Size.Z * 2)
		particleEmitter.CFrame = hitCharacter.HumanoidRootPart.CFrame
		
		--particleEmitter.ParticleEmitter.Rate = math.floor(particleEmitter.ParticleEmitter.Rate * Multiplier)
		
		local weld = Instance.new("WeldConstraint")
		weld.Parent = hitCharacter.HumanoidRootPart
		weld.Part0 = hitCharacter.HumanoidRootPart
		weld.Part1 = particleEmitter
		
		particleEmitter.ParticleEmitter.EmissionDirection = Enum.NormalId.Bottom
		particleEmitter.ParticleEmitter.Rotation = NumberRange.new(180, 180)

		local reducedWalkSpeed = math.floor(hitHumanoid.WalkSpeed / Multiplier)

		--set the character's walkspeed

		hitHumanoid.WalkSpeed = reducedWalkSpeed
		
		curSpeedStat.Value = hitHumanoid.WalkSpeed

		wait(Duration)

		hitHumanoid.WalkSpeed = hitHumanoid.WalkSpeed * Multiplier

		particleEmitter:Destroy()
		weld:Destroy()
		
		local check = hitCharacter:FindFirstChild("SpeedEmitter")
		if hitHumanoid.WalkSpeed > walkSpeedStatMax and not check then
			hitHumanoid.WalkSpeed = walkSpeedStatMax
		end
		curSpeedStat.Value = hitHumanoid.WalkSpeed
		return
	elseif Type == "SpeedUp" then
		local particleEmitter = game.ReplicatedStorage.EffectImages.SpeedEmitter:Clone()
		particleEmitter.Parent = workspace
		particleEmitter.Size = Vector3.new(hitCharacter.HumanoidRootPart.Size.X, hitCharacter.HumanoidRootPart.Size.Y, hitCharacter.HumanoidRootPart.Size.Z * 2)
		particleEmitter.CFrame = hitCharacter.HumanoidRootPart.CFrame
		
		particleEmitter.ParticleEmitter.Rate = math.floor(particleEmitter.ParticleEmitter.Rate * Multiplier)
		
		local weld = Instance.new("WeldConstraint")
		weld.Parent = hitCharacter.HumanoidRootPart
		weld.Part0 = hitCharacter.HumanoidRootPart
		weld.Part1 = particleEmitter

		particleEmitter.ParticleEmitter.EmissionDirection = Enum.NormalId.Top

		local IncreasedWalkSpeed = math.floor(hitHumanoid.WalkSpeed * Multiplier)

		--set the character's walkspeed

		hitHumanoid.WalkSpeed = IncreasedWalkSpeed
		
		curSpeedStat.Value = hitHumanoid.WalkSpeed

		wait(Duration)

		hitHumanoid.WalkSpeed = hitHumanoid.WalkSpeed - (IncreasedWalkSpeed - walkSpeedStatMax)

		particleEmitter:Destroy()
		weld:Destroy()

		local check = hitCharacter:FindFirstChild("SpeedEmitter")
		if hitHumanoid.WalkSpeed < walkSpeedStatMax and not check then
			hitHumanoid.WalkSpeed = walkSpeedStatMax
		end
		curSpeedStat.Value = hitHumanoid.WalkSpeed
		return
	end
end
1 Like

instead of doing “and not check” try this

if hitHumanoid.WalkSpeed < walkSpeedStatMax  then
if check then
print("Check Works")
else
hitHumanoid.WalkSpeed = walkSpeedStatMax
end
			
end

This is a good way to debug, since nesting the if statements would give us the same result you are looking for.

hold on, im an idiot, just realized i put it into workspace, not the character. originally did that to prevent hitbox issues but i see the issue now

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.