Problem with player classes

I have a player class, player_infantry in gamemodes/vault/gamemode/player_class/. However when the player spawns, I get this error


SetPlayerClass - attempt to use unknown player class player_infantry

I do not understand what I am doing wrong, I followed both the tutorial and the base source exactly

vault/gamemode/init.lua


AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")

TEAM_ATTACKERS = 2
TEAM_DEFENDERS = 3
TEAM_SEERS = 1

function GM:PlayerInitialSpawn(ply)
	ply:SetTeam(TEAM_SEERS)
	local RDM=math.random(TEAM_ATTACKERS,TEAM_DEFENDERS)
	ply:SetTeam(RDM)
	ATT=team.NumPlayers(TEAM_ATTACKERS)
	DEF=team.NumPlayers(TEAM_DEFENDERS)
	if ATT>DEF then
		ply:SetTeam(TEAM_DEFENDERS)
	elseif DEF>ATT then
		ply:SetTeam(TEAM_ATTACKERS)
	end
	if ply:Team()==TEAM_ATTACKERS then
		ply:PrintMessage(HUD_PRINTTALK,"You are now a member of the Attackers")
	elseif ply:Team()==TEAM_DEFENDERS then
		ply:PrintMessage(HUD_PRINTTALK,"You are now a member of the Defenders")
	elseif ply:Team()==TEAM_SEERS then
		ply:PrintMessage(HUD_PRINTTALK,"You are now a seer.")
	else
		ply:PrintMessage(HUD_PRINTTALK,"You was switched to an unknown team :(")
	end
end

function GM:PlayerShouldTakeDamage(ply,victim)
	if ply:IsPlayer()&&victim:IsPlayer() then
		if ply:Team()==victim:Team() then
			return false
		end
	end
	return true
end

function GM:PlayerSpawn(ply)
	player_manager.SetPlayerClass(ply,"player_infantry")
end

function GM:ShowSpare1(ply)
	if(ply:IsPlayer()) then
		local trace = {}
		trace.start = ply:EyePos()
		trace.endpos = trace.start + ply:GetAimVector() * 85
		trace.filter = ply

		local tr = util.TraceLine(trace)

		if ply:GetAmmoCount("Xbowbolt")>=1 then
			ply:RemoveAmmo(1,"Xbowbolt")
			if SERVER then
				local bag=ents.Create("item_ammo_smg1")
				bag:SetPos(tr.HitPos)
				bag:SetOwner(ply)
				bag:Spawn()
				bag:Activate()
			end
		end
	end
end

vault/gamemode/shared.lua


include("player_class/player_infantry.lua")

TEAM_ATTACKERS = 2
TEAM_DEFENDERS = 3
TEAM_SEERS = 1

GM.Name 	= "Vault Invasion"
GM.Author 	= "LemonLake"
GM.Email 	= "lemonplays@gmail.com"
GM.Website 	= "http://www.youtube.com/playfullemon"

function GM:Initialize()

	self.BaseClass.Initialize( self )
	
end

function GM:RoundStart()
	Msg("Checking for map ammo positions")
	// Check for, load and check ammo spawn file.
	Msg("Loading map ammo positions")
end


team.SetUp(TEAM_ATTACKERS,"Attackers",Color(255,0,0))
team.SetUp(TEAM_DEFENDERS,"Defenders",Color(0,255,0))
team.SetUp(TEAM_SEERS,"Seers",Color(155,155,155))

util.PrecacheModel("models/Humans/Group01/male_07.mdl") // Defenders Infantry

util.PrecacheModel("models/Humans/Group03/male_06.mdl") // Attackers Infantry

vault/gamemode/player_class/player_infantry.lua (I tried copying the base one instead of from the tutorial, but its pretty much the same)


AddCSLuaFile()

include( 'taunt_camera.lua' )

TEAM_ATTACKERS = 2
TEAM_DEFENDERS = 3
TEAM_SEERS = 1

local PLAYER = {}

PLAYER.DisplayName			= "Infantry"

PLAYER.WalkSpeed 			= 400		-- How fast to move when not running
PLAYER.RunSpeed				= 600		-- How fast to move when running
PLAYER.CrouchedWalkSpeed 	= 0.2		-- Multiply move speed by this when crouching
PLAYER.DuckSpeed			= 0.3		-- How fast to go from not ducking, to ducking
PLAYER.UnDuckSpeed			= 0.3		-- How fast to go from ducking, to not ducking
PLAYER.JumpPower			= 200		-- How powerful our jump should be
PLAYER.CanUseFlashlight     = true		-- Can we use the flashlight
PLAYER.MaxHealth			= 100		-- Max health we can have
PLAYER.StartHealth			= 100		-- How much health we start with
PLAYER.StartArmor			= 0			-- How much armour we start with
PLAYER.DropWeaponOnDie		= false		-- Do we drop our weapon when we die
PLAYER.TeammateNoCollide 	= true		-- Do we collide with teammates or run straight through them
PLAYER.AvoidPlayers			= true		-- Automatically swerves around other players


--
-- Set up the network table accessors
--
function PLAYER:SetupDataTables()


end

--
-- Called when the class object is created (shared)
--
function PLAYER:Init()

end

--
-- Called serverside only when the player spawns
--
function PLAYER:Spawn()


end

--
-- Called on spawn to give the player their default loadout
--
function PLAYER:Loadout()

	self.Player:Give("weapon_real_cs_tmp")
	self.Player:Give("weapon_real_cs_five-seven")
	self.Player:RemoveAllAmmo()
	self.Player:GiveAmmo(32,"pistol",false)
	self.Player:GiveAmmo(256,"SMG1",false)
	self.Player:GiveAmmo(3,"grenade",false)
	self.Player:GiveAmmo(1,"Xbowbolt",false)
	if self.Player:Team()==2 then
		self.Player:SetModel("models/player/Group03/male_06.mdl")
	elseif self.Player:Team()==3 then
		self.Player:SetModel("models/player/Group01/male_07.mdl")
	end

end

-- Clientside only
function PLAYER:CalcView( view ) end		-- Setup the player's view
function PLAYER:CreateMove( cmd ) end		-- Creates the user command on the client
function PLAYER:ShouldDrawLocal() end		-- Return true if we should draw the local player

-- Shared
function PLAYER:StartMove( cmd, mv ) end	-- Copies from the user command to the move
function PLAYER:Move( mv ) end				-- Runs the move (can run multiple times for the same client)
function PLAYER:FinishMove( mv ) end		-- Copy the results of the move back to the Player


player_manager.RegisterClass( "plyaer_infantry", PLAYER, nil )

I’d appreciate any and all help regarding this issue, thank you

At the bottom of your player infantry code you have a typo,
change


player_manager.RegisterClass( "plyaer_infantry", PLAYER, nil )

to


player_manager.RegisterClass( "player_infantry", PLAYER, nil )

I fixed that, however I still have the same issue. I also tried it with player_default instead of player_infantry - the error never occurred however the script was never called.

[EDIT] I am going to try placing player_infantry in my /gamemode/ folder. Failed.

[EDIT 2] I have switched to usage of multiple teams instead. Thanks anyway