Style
It's easier to deal with good code, and good code has mistakes more obvious.
Tab your code correctly.
:FindFirstChild("Obj") and .Obj both return the object with the given name. The reason why you use :FindFirstChild is in case the object doesn't exist, you get nil instead of an error.
However, if you have code like this:
player:FindFirstChild("PlayerGui").WalkSpeedPass
that benefit is destroyed, because (nil).WalkSpeedPass will result in an error.
If you use :FindFirstChild, you should explicitly deal with nil. If you aren't, then you shouldn't use :FindFirstChild, you should use just use .PlayerGui, or you could use :WaitForChild("PlayerGui").
You also repeat that line three times. Save it ahead of time in a variable.
local frame = player:WaitForChild("PlayerGui").WalkSpeedPass.Frame
You shouldn't use Disabled to control the current script. Just stop working if you want to! break in this case will clean that up.
Use consistent quoting, either ' or ", not both -- it just makes things more complicated than necessary.
Pick good variable names! You don't use i, so just call it _. You should pick a better name than v, maybe perker since it's from a list of Perkers?
Cleaned up
Your code now looks like this:
local passid = 236050258
local GamePassService = game:GetService("GamePassService")
local player = script.Parent.Parent.Parent.Parent.Parent
local frame = player:WaitForChild("PlayerGui").WalkSpeedPass.Frame
while true do
wait(1)
for _, perker in pairs(game.ReplicatedStorage.Perkers:GetChildren()) do
if GamePassService:PlayerHasPass(player, passid) then
frame.Visible = true
elseif player.Name == perker.Value then
warn("Watchme naeynaey")
frame.Visible = true
else
frame.Visible = false
break
end
end
end
Fixing Problems
There's something suspicious here: the for loop has an if with an else. That means you will always take action based on just the first perker. That's probably not what you want.
When any single perker doesn't match, then you don't have to do anything. Just default with the frame invisible.
local passid = 236050258
local GamePassService = game:GetService("GamePassService")
local player = script.Parent.Parent.Parent.Parent.Parent
local frame = player:WaitForChild("PlayerGui").WalkSpeedPass.Frame
while true do
wait(1)
frame.Visible = false
for _, perker in pairs(game.ReplicatedStorage.Perkers:GetChildren()) do
if GamePassService:PlayerHasPass(player, passid) then
frame.Visible = true
elseif player.Name == perker.Value then
warn("Watchme naeynaey")
frame.Visible = true
end
end
end
You should probably break when it becomes visible, rather than not. Otherwise there's no reason for the while loop.
Unless you plan on people buying the gamepass while this is running, there's no reason for the while loop at all.
The first if doesn't actually use the perker, so it probably doesn't belong in the for loop. This could be a lot cleaner looking if you used functions:
local passid = 236050258
local GamePassService = game:GetService("GamePassService")
local player = script.Parent.Parent.Parent.Parent.Parent
function hasGamePass()
return GamePassService:PlayerHasPass(player, passid)
end
function isPerker()
for _, perker in pairs(game.ReplicatedStorage.Perkers:GetChildren()) do
if perker.Value == player.Name then
return true
end
end
return false
end
local frame = player:WaitForChild("PlayerGui").WalkSpeedPass.Frame
while true do
wait(1)
frame.Visible = false
if isPerker() or hasGamePass() then
frame.Visible = true
end
end
The if is actually unnecessary now, since frame.Visible is just going to be the same as the condition.
local passid = 236050258
local GamePassService = game:GetService("GamePassService")
local player = script.Parent.Parent.Parent.Parent.Parent
function hasGamePass()
return GamePassService:PlayerHasPass(player, passid)
end
functoin isPerker()
for _, perker in pairs(game.ReplicatedStorage.Perkers:GetChildren()) do
if perker.Value == player.Name then
return true
end
end
return false
end
local frame = player:WaitForChild("PlayerGui").WalkSpeedPass.Frame
while true do
frame.Visible = isPerker() or hasGamePass()
wait(1)
end