Why do I keep getting this error message?

Hello everyone! Every time I run my code I keep getting this error message:
’ ServerScriptService.Arena1Script:84: attempt to index nil with ‘LoadCharacter’ ’

I’m not sure what this means, could anyone help?
It’s on line 84, here is my script:

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

local part1 = workspace.Arena1Player1
local part2 = workspace.Arena1Player2

local team1 = workspace.Arena1Team1
local team2 = workspace.Arena1Team2

local standingOnArena1Player1 = nil
local standingOnArena1Player2 = nil
local RemoteEvent = game.ReplicatedStorage:FindFirstChild("RemoteEvent")

local function startEvent()

	local plr1CurrentKills = 0
	local plr2CurrentKills = 0

	local SwordGiver = game.ServerStorage.Sword

	local player1 = standingOnArena1Player1
	local player2 = standingOnArena1Player2
	
	local ArenaScore1 = player1.PlayerGui.ArenaScore
	local ArenaScore2 = player2.PlayerGui.ArenaScore
	
	ArenaScore1.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills
	ArenaScore2.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills
	
	ArenaScore1.Enabled = true
	ArenaScore2.Enabled = true

	local Sword1 = SwordGiver:Clone()
	local Sword2 = SwordGiver:Clone()
	local char1 = player1.Character
	local char2 = player2.Character
	local Arena1Player1Spawn = game.Workspace.Arena1Player1Spawn
	local Arena1Player2Spawn = game.Workspace.Arena1Player2Spawn

	local character1Loaded = false
	local character2Loaded = false


	print("Variables working fine")


	if char1 or char2 then


		local humanoid1 = char1:FindFirstChild("Humanoid")
		local humanoid2 = char2:FindFirstChild("Humanoid")


		if humanoid1 or humanoid2 then

			Sword1.Parent = player1.Backpack
			humanoid1:EquipTool(Sword1)
			Sword2.Parent = player2.Backpack
			humanoid2:EquipTool(Sword2)

			print("Approved that i'm humanoid")

			local connections = {}

			local function disconnectConnections(kills)
				if kills > 5 then
					for i, v in ipairs(connections) do
						v:Disconnect()
					end

					plr1CurrentKills = 0
					plr2CurrentKills = 0
					part1.Transparency = 0
					part1.CanCollide = true
					part2.Transparency = 0
					part2.CanCollide = true
				end
			end

			connections[1] = player1.CharacterRemoving:Connect(function(hit)

				local player1 = game.Players:GetPlayerFromCharacter(char1)
				wait(2)
				player1:LoadCharacter()
				char1 = player1.Character
				local humanoid1 = char1.Humanoid
				
				ArenaScore1 = player1.PlayerGui.ArenaScore
				ArenaScore2 = player2.PlayerGui.ArenaScore
				
				ArenaScore1.Enabled = true
				ArenaScore2.Enabled = true

				plr2CurrentKills = plr2CurrentKills + 1
				
				ArenaScore1.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills
				ArenaScore2.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills

				disconnectConnections(plr2CurrentKills) -- will check the kills and disconnect connections if it's over 5

				char2.Humanoid.Health = 100

				Sword1.Parent = player1.Backpack
				humanoid1:EquipTool(Sword1)

				char2.HumanoidRootPart.CFrame = CFrame.new(
					Arena1Player2Spawn.Position
				)
				char1.HumanoidRootPart.CFrame = CFrame.new(
					Arena1Player1Spawn.Position
				)
			end)
			connections[2] = player2.CharacterRemoving:Connect(function(hit)
				
				local player2 = game.Players:GetPlayerFromCharacter(char2)
				wait(2)
				player2:LoadCharacter()
				char2 = player2.Character
				local humanoid2 = char2.Humanoid
				
				ArenaScore1 = player1.PlayerGui.ArenaScore
				ArenaScore2 = player2.PlayerGui.ArenaScore
				
				ArenaScore1.Enabled = true
				ArenaScore2.Enabled = true
				
				plr1CurrentKills = plr1CurrentKills + 1
				
				ArenaScore1.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills
				ArenaScore2.ScoreBoard.Scores.Text = plr1CurrentKills..":"..plr2CurrentKills

				disconnectConnections(plr1CurrentKills) -- will check the kills and disconnect connections if it's over 5

				char1.Humanoid.Health = 100

				Sword2.Parent = player2.Backpack
				humanoid2:EquipTool(Sword2)

				char1.HumanoidRootPart.CFrame = CFrame.new(
					Arena1Player1Spawn.Position
				)
				char2.HumanoidRootPart.CFrame = CFrame.new(
					Arena1Player2Spawn.Position
				)
			end)
		end
	end		
end

RemoteEvent.OnServerEvent:Connect(function() -- if any player presses the play button, executes event
	if standingOnArena1Player2 ~= nil and standingOnArena1Player1 ~= nil then
		--Hide playbutton gui
		standingOnArena1Player2.PlayerGui.ScreenGui.Enabled = false
		standingOnArena1Player1.PlayerGui.ScreenGui.Enabled = false
		--Teleports
		workspace[standingOnArena1Player1.Name].HumanoidRootPart.CFrame = CFrame.new(team1.Position.X,team1.Position.Y,team1.Position.Z)
		workspace[standingOnArena1Player1.Name].HumanoidRootPart.CFrame *= CFrame.Angles(0, math.rad(90), 0)
		workspace[standingOnArena1Player2.Name].HumanoidRootPart.CFrame = CFrame.new(team2.Position.X,team2.Position.Y,team2.Position.Z)
		workspace[standingOnArena1Player2.Name].HumanoidRootPart.CFrame *= CFrame.Angles(0, math.rad(270), 0)
		local gameRunning = true
		part1.Transparency = 1
		part1.CanCollide = false
		part2.Transparency = 1
		part2.CanCollide = false
		startEvent() -- triggers function
	end
end)


-----------------------------------------------------

--				PART1 Events				 --

-----------------------------------------------------

-- Touched functions [Events now set each part that was touched to the players name instead of the opposite button]

part1.Touched:Connect(function(TouchedPart) -- Touched

	local Player = Players:GetPlayerFromCharacter(TouchedPart.Parent)

	if Player then -- Check if it found character
		if standingOnArena1Player1 == nil then -- Check if not standing and if not occupied

			part1.BrickColor = BrickColor.new("Teal") -- Set color
			standingOnArena1Player1 = Player
		end	
	end
end)

part1.TouchEnded:Connect(function(TouchedPart)

	local Player = Players:GetPlayerFromCharacter(TouchedPart.Parent)

	if Player then -- Check if it found character
		if standingOnArena1Player1 ~= nil then -- Check if standing and is occupied
			if  standingOnArena1Player1.PlayerGui.ScreenGui.Enabled == true then
				standingOnArena1Player1.PlayerGui.ScreenGui.Enabled = false
			end
			part1.BrickColor = BrickColor.new("Smoky grey") -- Set color
			standingOnArena1Player1 = nil

			if standingOnArena1Player2 ~= nil then
				if standingOnArena1Player2.PlayerGui.ScreenGui.Enabled == true then
					standingOnArena1Player2.PlayerGui.ScreenGui.Enabled = false
				end
			end
		end	
	end
end)

-----------------------------------------------------

--				PART2 Events				 --

-----------------------------------------------------

part2.Touched:Connect(function(TouchedPart) -- Touched

	local Player = Players:GetPlayerFromCharacter(TouchedPart.Parent)

	if Player then -- Check if it found character
		if standingOnArena1Player2 == nil then -- Check if not standing and if not occupied

			part2.BrickColor = BrickColor.new("Teal") -- Set color
			standingOnArena1Player2 = Player
		end	
	end
end)

part2.TouchEnded:Connect(function(TouchedPart)

	local Player = Players:GetPlayerFromCharacter(TouchedPart.Parent)

	if Player then -- Check if it found character
		if standingOnArena1Player2 ~= nil then -- Check if standing and is occupied
			if   standingOnArena1Player2.PlayerGui.ScreenGui.Enabled == true then
				standingOnArena1Player2.PlayerGui.ScreenGui.Enabled = false
			end
			part2.BrickColor = BrickColor.new("Smoky grey") -- Set color
			standingOnArena1Player2 = nil

			if standingOnArena1Player1 ~= nil then
				if  standingOnArena1Player1.PlayerGui.ScreenGui.Enabled == true then
					standingOnArena1Player1.PlayerGui.ScreenGui.Enabled = false
				end
			end
		end	
	end
end)

while task.wait(0) do
	if standingOnArena1Player2 ~= nil and standingOnArena1Player1 ~= nil then -- checks if both players are on top
		standingOnArena1Player2.PlayerGui.ScreenGui.Enabled = true
		standingOnArena1Player1.PlayerGui.ScreenGui.Enabled = true
	end
end

1 Like

You are not providing a valid Instance for Player.

1 Like

Oh ok, thank you, sorry I’m new to scripting, how would I fix this?

Don’t override player1 and player2 in the CharacterRemoving event like this:

local player1 = game.Players:GetPlayerFromCharacter(char1)

Try removing it and seeing if this fixes your problem!

1 Like

Thank you very much it worked, however now, when I kill the other player, it keeps looping through the playerRemoved even though I only killed them once, it keeps teleporting them over and over until the kills reach 6. Any ideas how I can fix this?
(there aren’t any error messages)

There is no PlayerRemoved event being used in your code. I suggest optimizing your code and use more reliable events like Humanoid.Died.

1 Like

Sorry, i meant characterRemoving, I had humanoid.Died before but it kept giving me loads of issues for some reason.

Maybe try removing the usage of LoadCharacter inside the CharacterRemoving event. This would probably be the reason for looping.

1 Like

Thank you i’ll test it in a minute, sorry to ask so many questions, but do you know a way I can make the player teleport quicker after they respawn because there is quite a big delay between them respawning and getting teleported back to the arena. Ideally i would like the player to not even be able to tell they are being teleported, it seems to them more like they just spawned in the arena?

1 Like