Can't find players character

  1. What do you want to achieve? Keep it simple and clear!
    I want my script find the players character.

  2. What is the issue? Include screenshots / videos if possible!
    Script:
    local Jenny = game.Workspace.JennyAnimated

local Humanoid = Jenny.Humanoid

local Humanoid2 = Jenny:WaitForChild(“Humanoid”)

local PlayerC = game.Players:FindFirstChildWhichIsA(“Player”).Character or game.Players:FindFirstChildWhichIsA(“PlayerC”).CharacterAdded:Wait()

local PlayerHRP = PlayerC:WaitForChild(“HumanoidRootPart”)

print(PlayerHRP)

local Jenny = script.Parent

local Humanoid = Jenny.Humanoid

local PFS = game:GetService(“PathfindingService’”)

local Path = PFS:CreatePath()

Path:ComputeAsync(Jenny.HumanoidRootPart.Position,game.Workspace.PlayerHRP.Position)

local WP = Path:GetWayPoints()

for i, waypoint in pairs(WP) do

Humanoid2:MoveTo(waypoint.Position)

Humanoid2.MoveToFinished:Wait()

end

while true do

wait()

Humanoid:MoveTo(PlayerHRP.Position)

end

When I play the game, this message pops up in the output: Workspace.JennyAnimated.FollowScript:4: attempt to index nil with ‘Character’

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?
    I can’t think of any solutions, and I can’t find any solutions on the Developer Hub.

This is a bad way to get the player’s character as it could (in some rare case) reference something else. Instead, you should do something like this:

local Character = Player.Character or Player.CharacterAdded:Wait() -- replace "Player" with your player variable
local SearchDistance = 100
local ZombieDamage = 0


local canWander = true
local WanderX, WanderZ = 30, 30



function getHumanoid(model)
	for _, v in pairs(model:GetChildren()) do
		if v:IsA'Humanoid' then
			return v
		end
	end
end


local zombie = script.Parent
local human = getHumanoid(zombie)
local hroot = zombie.HumanoidRootPart
local zspeed = hroot.Velocity.magnitude


local pfs = game:GetService("PathfindingService")

function GetPlayerNames()
	local players = game:GetService('Players'):GetChildren()
	local name = nil
	for _, v in pairs(players) do
		if v:IsA'Player' then
			name = tostring(v.Name)
		end
	end
	return name
end



function GetPlayersBodyParts(t)
	local torso = t
	if torso then
		local figure = torso.Parent
		for _, v in pairs(figure:GetChildren()) do
			if v:IsA'Part' then
				return v.Name
			end
		end
	else
		return "HumanoidRootPart"
	end
end

function GetTorso(part)
	local chars = game.Workspace:GetChildren()
	local torso = nil
	for _, v in pairs(chars) do
		if v:IsA'Model' and v ~= script.Parent and v.Name == GetPlayerNames() then
			local charRoot = v:FindFirstChild'HumanoidRootPart'
			if (charRoot.Position - part).magnitude < SearchDistance then
				torso = charRoot
			end
		end
	end
	return torso
end

for _, zambieparts in pairs(zombie:GetChildren()) do
	if zambieparts:IsA'Part' then
		zambieparts.Touched:connect(function(p)
			if p.Parent.Name == GetPlayerNames() and p.Parent.Name ~= zombie.Name then -- damage
				local enemy = p.Parent
				local enemyhuman = getHumanoid(enemy)
				enemyhuman:TakeDamage(ZombieDamage)
			end
		end)
	end
end


local path
local waypoint
local oldpoints
local isWandering = 0

if canWander then
	spawn(function()
		while isWandering == 0 do
			isWandering = 1
			local desgx, desgz = hroot.Position.x + math.random(-WanderX, WanderX), hroot.Position.z + math.random(-WanderZ, WanderZ)
			human:MoveTo( Vector3.new(desgx, 0, desgz) )
			wait(math.random(4, 6))
			isWandering = 0
		end
	end)
end

while wait() do
	local enemytorso = GetTorso(hroot.Position)	
	if enemytorso ~= nil then
		isWandering = 1
		local function checkw(t)
			local ci = 3
			if ci > #t then
				ci = 3
			end
			if t[ci] == nil and ci < #t then
				repeat
					ci = ci + 1
					wait()
				until t[ci] ~= nil
				return Vector3.new(1, 0, 0) + t[ci]
			else
				ci = 3
				return t[ci]
			end
		end
		
		path = pfs:FindPathAsync(hroot.Position, enemytorso.Position)
		waypoint = path:GetWaypoints()
		oldpoints = waypoint
		local connection
		
		local direct = Vector3.FromNormalId(Enum.NormalId.Front)
		local ncf = hroot.CFrame * CFrame.new(direct)
		direct = ncf.p.unit
		local rootr = Ray.new(hroot.Position, direct)
		local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot)
		
		if path and waypoint or checkw(waypoint) then
			if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then
				human:MoveTo( checkw(waypoint).Position )
				human.Jump = false
			end
			
			
			if connection then
				connection:Disconnect()
			end
			
		else
			for i = 3, #oldpoints do
				human:MoveTo( oldpoints[i].Position )	
			end
		end
	elseif enemytorso == nil and canWander then -- if player not detected
		isWandering = 0
		path = nil
		waypoint = nil
		human.MoveToFinished:Wait()
	end
end

add this as a server script inside of your jenny

I don’t quite understand the script, so sorry, no.

It is an AI script

filler text filler text

What player variable? I don’t understand.

Is your game a 1 player game?

abcdefghijklmnopqrstuvwxyz

Yes, it’s a 1 player game. Why?

This code is so bad so I am going to rewrite a script for you

put this script in a server script in your jenny (it is an AI, it will make your thing follow the player)

local SearchDistance = 0 -- put here how big you want the radius of your zombie to be
local ZombieDamage = 0 -- put here how much damage you want to zombie to do


local canWander = true -- do you want the zombie to go into an idle mode? (aka: wandering around the place when a player is not in its radius)
local WanderX, WanderZ = 30, 30



function getHumanoid(model)
	for _, v in pairs(model:GetChildren()) do
		if v:IsA'Humanoid' then
			return v
		end
	end
end


local zombie = script.Parent
local human = getHumanoid(zombie)
local hroot = zombie.HumanoidRootPart
local zspeed = hroot.Velocity.magnitude


local pfs = game:GetService("PathfindingService")

function GetPlayerNames()
	local players = game:GetService('Players'):GetChildren()
	local name = nil
	for _, v in pairs(players) do
		if v:IsA'Player' then
			name = tostring(v.Name)
		end
	end
	return name
end



function GetPlayersBodyParts(t)
	local torso = t
	if torso then
		local figure = torso.Parent
		for _, v in pairs(figure:GetChildren()) do
			if v:IsA'Part' then
				return v.Name
			end
		end
	else
		return "HumanoidRootPart"
	end
end

function GetTorso(part)
	local chars = game.Workspace:GetChildren()
	local torso = nil
	for _, v in pairs(chars) do
		if v:IsA'Model' and v ~= script.Parent and v.Name == GetPlayerNames() then
			local charRoot = v:FindFirstChild'HumanoidRootPart'
			if (charRoot.Position - part).magnitude < SearchDistance then
				torso = charRoot
			end
		end
	end
	return torso
end

for _, zambieparts in pairs(zombie:GetChildren()) do
	if zambieparts:IsA'Part' then
		zambieparts.Touched:connect(function(p)
			if p.Parent.Name == GetPlayerNames() and p.Parent.Name ~= zombie.Name then -- damage
				local enemy = p.Parent
				local enemyhuman = getHumanoid(enemy)
				enemyhuman:TakeDamage(ZombieDamage)
			end
		end)
	end
end


local path
local waypoint
local oldpoints
local isWandering = 0

if canWander then
	spawn(function()
		while isWandering == 0 do
			isWandering = 1
			local desgx, desgz = hroot.Position.x + math.random(-WanderX, WanderX), hroot.Position.z + math.random(-WanderZ, WanderZ)
			human:MoveTo( Vector3.new(desgx, 0, desgz) )
			wait(math.random(4, 6))
			isWandering = 0
		end
	end)
end

while wait() do
	local enemytorso = GetTorso(hroot.Position)	
	if enemytorso ~= nil then
		isWandering = 1
		local function checkw(t)
			local ci = 3
			if ci > #t then
				ci = 3
			end
			if t[ci] == nil and ci < #t then
				repeat
					ci = ci + 1
					wait()
				until t[ci] ~= nil
				return Vector3.new(1, 0, 0) + t[ci]
			else
				ci = 3
				return t[ci]
			end
		end
		
		path = pfs:FindPathAsync(hroot.Position, enemytorso.Position)
		waypoint = path:GetWaypoints()
		oldpoints = waypoint
		local connection
		
		local direct = Vector3.FromNormalId(Enum.NormalId.Front)
		local ncf = hroot.CFrame * CFrame.new(direct)
		direct = ncf.p.unit
		local rootr = Ray.new(hroot.Position, direct)
		local phit, ppos = game.Workspace:FindPartOnRay(rootr, hroot)
		
		if path and waypoint or checkw(waypoint) then
			if checkw(waypoint) ~= nil and checkw(waypoint).Action == Enum.PathWaypointAction.Walk then
				human:MoveTo( checkw(waypoint).Position )
				human.Jump = false
			end
			
			
			if connection then
				connection:Disconnect()
			end
			
		else
			for i = 3, #oldpoints do
				human:MoveTo( oldpoints[i].Position )	
			end
		end
	elseif enemytorso == nil and canWander then -- if player not detected
		isWandering = 0
		path = nil
		waypoint = nil
		human.MoveToFinished:Wait()
	end
end

I need to understand every detail, and that’s gonna take you years to explain to me. So no.

this is probably never going to get fixed then, plus if you cant understand this basic of a script then you are probably not fit to make a game or script a game

Dude, that stuff is really advanced. If I’m not fit to make a game, then do you want me to stop? How else would I learn to make a game?

You could easily understand what I just sent if you watched a simple tutorial on youtube

If you think this is really advanced then you have no idea what advanced is

That’s what I’m trying to do, but there’s no YouTuber that explains all of it.

I did what you said, but now it says: GetWayPoints is not a valid member of Path “Instance”

It’s GetWaypoints, not GetWayPoints (note the capitalisation).

Oh, thank you. Why didn’t I think of that?

It still gives the message. :confused: