Player getting returned nil

I am trying to move my Player variable between scripts using a remote event but it keeps returning nil.

Normal Script:

local Player = GetPlayer(hit)
if Player == false then return end
Gem.CanTouch = false
Gem.Transparency = 1
AddGems:FireClient(Player)

Local Script:

local Rep = game:GetService("ReplicatedStorage")
local AddGems = Rep:WaitForChild("AddGems")

AddGems.OnClientEvent:Connect(function(Player)
	Player.Gems.Gems.Value += 1
end)

Error:
image

try checking for the player in Players like in a local script

local plr = game:GetService(‘Players’):FindFirstChild(‘Player’)

Sorry here is my full script for getting the player:

local Rep = game:GetService("ReplicatedStorage")
local AddGems = Rep:WaitForChild("AddGems")
local Levels = game.Workspace.Levels:GetChildren()

function GetPlayer(hit)
	if game.Players:FindFirstChild(hit.Parent.Name) then 
		return game.Players:FindFirstChild(hit.Parent.Name)
	elseif game.Players:FindFirstChild(hit.Parent.Parent.Name) then 
		return game.Players:FindFirstChild(hit.Parent.Parent.Name)
	else 
		return false
	end
end

for _, Level in pairs(Levels)  do
	local Gems = Level.Gems:GetChildren()
	for _, Gem in pairs(Gems) do
		Gem.Touched:Connect(function(hit)
			local Player = GetPlayer(hit)
			if Player == false then return end
			Gem.CanTouch = false
			Gem.Transparency = 1
			AddGems:FireClient(Player)
		end)
	end
end

Wait I got it. Basically :FireClient already sends player through as a variable so I just had to make it AddGems:FireClient(Player, Player) and then on the local script AddGems.OnClientEvent:Connect(function(Player)

1 Like

Adding player value in local script won’t work and exploiter can exploit it. So you might just wanna do it inside server script

If you wanna get player that touched it, use GetPlayerFromCharacter method.

1 Like

I would recommend making use of Players:GetPlayerFromCharacter() to more efficiently retrieve the player Instance without needing to look through the Players Service directly.

Example:

-- Define the Players Service at the top of the script
local Players = game:GetService("Players")

...

Gem.Touched:Connect(function(hit)
    local Player = Players:GetPlayerFromCharacter(hit.Parent)


The :FireClient() method does not send the player Instance to the client because the LocalPlayer can already be referenced in LocalScripts through the Players Service. This means that values that abide by the parameter limitations which are input to the :FireClient() method after the player Instance will be sent to the client.

Example:

-- Server Script
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RemoteEvent = ReplicatedStorage.RemoteEvent

workspace.examplePart.Touched:Connect(function(hit)
    local Player = Players:GetPlayerFromCharacter(hit.Parent)

    if Player then
        RemoteEvent:FireClient(Player, "Cool!")
    end
end)


-- LocalScript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local player = Players.LocalPlayer

local RemoteEvent = ReplicatedStorage.RemoteEvent

RemoteEvent.OnClientEvent:Connect(function(parameter1, parameter2)
    print(parameter1) -- "Cool!"
    print(parameter2) -- nil (a second value was not sent to the client)
end)

You shouldn’t do it like that.

Just define the player in the local script via local player = game.Players.LocalPlayer at the top.