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

Why am I still dying even when I have a ForceField and not dying when I don't?

This script is inside a part. And when you touch without a ForceField you lose 100 health. (There is a shop where you can buy more health. That's why you lose 100 health instead of just setting health to 0) And if you touch it with a ForceField, you're supposed to not lose any health and have a 25% chance of getting 100 points.

debounce = false
script.Parent.Touched:connect(function(hit)
	if not hit then
		return true
	elseif not hit.Parent then
		return true
	end
	local h = hit.Parent:findFirstChild("Humanoid")
	local ff = hit.Parent:FindFirstChild("ForceField1"),hit.Parent:FindFirstChild("ForceField2"),hit.Parent:FindFirstChild("ForceField3"),hit.Parent:FindFirstChild("ForceField4")
	local nff1 = hit.Parent:FindFirstChild("ForceField1",false)
	local nff2 = hit.Parent:FindFirstChild("ForceField2",false)
	local nff3 = hit.Parent:FindFirstChild("ForceField3",false)
	local nff4 = hit.Parent:FindFirstChild("ForceField4",false)
	local p = hit.Parent:findFirstChild("Grass"),hit.Parent:findFirstChild("Rock")
	if h then
		if ff then
			print (hit.Parent)--Player
			local points = game.Players:GetPlayerFromCharacter(hit.Parent):WaitForChild("Points")
			if hit.Parent.RocksLeft.Value ~= 0 then
				hit.Parent:WaitForChild("RocksLeft").Value = hit.Parent.RocksLeft.Value - 1
			else
				ff:Destroy()
			end
			local var1 = 1
			local var2 = math.random(1,4)
			if var2 == var1 then
				points.Value = points.Value + 100
			end
			script.Parent:Destroy()
		elseif nff1 or nff2 or nff3 or nff4 then
			if debounce == false then
				debounce = true
				h.Health = h.Health - 100
				print 'rip'
				script.Parent:Destroy()
			end
			wait(.5)
			debounce = false
		end
	elseif p then
		local var = math.random(1,3)
		if var == 1 then
			script.Parent:Destroy()
		end
	end
end)

The problem is that when you touch it with a ForceField you loose 100 health, and when you touch it without a ForceField you don't lose any health.

1 answer

First thing I see is that you are checking if a tuple is true in your if statement. Second I believe that you are using the second argument in the FindFirstChild method wrong. The second argument specifies whether to search recursively or not.(It defaults to false)

I created a function to make sure that we find all possible forcefields.

local debounce = false

function FindFF(Char)
	local T = {}
	for _,n in pairs(Char:GetChildren()) do
		if n:IsA("ForceField") then
			table.insert(T,n)
		end
	end
	return T
end

script.Parent.Touched:connect(function(hit)
	local char = hit.Parent
	local h = char:FindFirstChild("Humanoid")
	local ff = FindFF(char)
	local p = char:FindFirstChild("Grass") or char:FindFirstChild("Rock")
	if h then
		local rocks = char:WaitForChild("RocksLeft")
        if #ff > 0 then --If there is more than one forcefield
            local points = game.Players:GetPlayerFromCharacter(char):WaitForChild("Points")
            if rocks.Value > 0 then
               rocks.Value = rocks.Value - 1
            else
                --To only destroy one forcefield do:
				--ff[1]:Destroy()
				--To remove all forcefields to:
				--[[
					for _,n in pairs(ff) do
						n:Destroy()
					end
				--]]
           	end 
            if math.random(1,4) == 1 then 
                points.Value = points.Value + 100
            end
            script.Parent:Destroy()
        else
            if debounce == false then
                debounce = true
                h.Health = h.Health - 100
                print 'rip'
                script.Parent:Destroy()
				wait(.5)
           		debounce = false
            end            
        end
    elseif p then
    	if math.random(1,3) == 1 then
            script.Parent:Destroy()
        end
    end
end)

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