Authoritative Movement

I’m trying to combine these tutorials: http://www.palladiumgames.net/tutorials/unity-networking-tutorial/
and https://www.3dbuzz.com/training/view/3rd-person-character-system

My goal is to use the 3rd person character system in an authoritative server environment, where the server dictates movement to the client according to inputs it receives from the client.

I have not yet tried to include the camera from the 3rd person character system as I’m trying to get movement working and I’m doing this one step at a time

The playerhandler script is attached to the playerprefab, and the error(s) is/are in there somewhere

The Problem:
What is happening is that when the players spawns, their prefab drops slowly until it hits the ground where it stops, if i give it inputs, it stops falling midair but does not move.

I’m going to keep trying to make this work, but I’m honestly not sure what direction to go with this. any help where someone could explain to me whats going on here would be greatly appreciated. I want to understand this.
from googling for a while, it seems that not many people have tried to make the character system from 3dbuzz into multiplayer, and the few that have, have not gone with authoritative structures which is what i need and their movement is still dictated by the client and just synced between clients, so that doesn’t really help me much

The output.log from the server:

Initialize engine version: 4.3.4f1 (e444f76e01cd)
GfxDevice: creating device client; threaded=1
Direct3D:
    Version:  Direct3D 9.0c [nvd3dum.dll 9.18.13.3165]
    Renderer: NVIDIA GeForce 8400 GS    
    Vendor:   NVIDIA
    VRAM:     1898 MB (via DXGI)
    Caps:     Shader=30 DepthRT=1 NativeDepth=1 NativeShadow=1 DF16=0 INTZ=1 RAWZ=0 NULL=1 RESZ=0 SlowINTZ=0
Begin MonoManager ReloadAssembly
Platform assembly: C:\GAMEDIR2\SRV\Server_Data\Managed\UnityEngine.dll (this message is harmless)
Loading C:\GAMEDIR2\SRV\Server_Data\Managed\UnityEngine.dll into Unity Child Domain
Platform assembly: C:\GAMEDIR2\SRV\Server_Data\Managed\Assembly-CSharp.dll (this message is harmless)
Loading C:\GAMEDIR2\SRV\Server_Data\Managed\Assembly-CSharp.dll into Unity Child Domain
- Completed reload, in  0.066 seconds
<RI> Initializing input.

<RI> Input initialized.

desktop: 1024x768 70Hz; virtual: 1024x768 at 0,0
Running as server. Player ID is 0.
 
(Filename:  Line: 2479)

New connection established (127.0.0.1:63872)
 
(Filename:  Line: 2479)

Network protocol version 0 connected
 
(Filename:  Line: 2489)

New scope index 0 is now in scope for AllocatedID: 0
 
(Filename:  Line: 2479)

New scope index 0 is now in scope for SceneID: 1 Level Prefix: 0
 
(Filename:  Line: 2479)

Allocated 2 batches of size 50 for player 1
 
(Filename:  Line: 2489)

Sent initalization to player 1
 
(Filename:  Line: 2479)

Sending generic initial state update, broadcast on, view ID 'SceneID: 1 Level Prefix: 0'

 
(Filename:  Line: 2489)

Received RPC 'AccountCreate'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: AccountCreate - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Platform assembly: C:\GAMEDIR2\SRV\Server_Data\Managed\System.Xml.dll (this message is harmless)
Platform assembly: C:\GAMEDIR2\SRV\Server_Data\Managed\System.dll (this message is harmless)
Received RPC 'AccountLogin'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: AccountLogin - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Received RPC 'RequestSpawn'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: RequestSpawn - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Allocating view ID AllocatedID: 1.

 
(Filename:  Line: 2479)

Sent RPC call '__RPCNetworkInstantiate' to all connected clients

 
(Filename:  Line: 2479)

Added RPC '__RPCNetworkInstantiate' to buffer.
 
(Filename:  Line: 2479)

Assigning a view ID: old view ID 'AllocatedID: 0', new view ID 'AllocatedID: 1'

 
(Filename:  Line: 2489)

Sent RPC call 'SetPlayer' to all connected clients

 
(Filename:  Line: 2479)

Added RPC 'SetPlayer' to buffer.
 
(Filename:  Line: 2479)

Sending generic initial state update, broadcast on, view ID 'AllocatedID: 1'

 
(Filename:  Line: 2489)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)


 
(Filename:  Line: 2489)

Sending generic state update, broadcast on, view ID 'AllocatedID: 1'

 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

NullReferenceException: Object reference not set to an instance of an object
  at PlayerHandler.SnapAlignCharacterWithCamera (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.UpdateMotor (UnityEngine.Transform targetLookAtTransform) [0x00000] in <filename unknown>:0 

  at PlayerHandler.Update () [0x00000] in <filename unknown>:0 
 
(Filename:  Line: -1)

Received RPC 'SendMovementInput'- mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)

Relay RPC - name: SendMovementInput - mode 0 - sender 127.0.0.1:63872
 
(Filename:  Line: 2489)
using UnityEngine;
using System.Collections;

public class PlayerHandler : MonoBehaviour
{
	public static CharacterController CharacterController;
	
	public static PlayerHandler Instance;
	Vector3 MoveVector { get ; set; }
	float VerticalVelocity {get ; set; }
	float ForwardSpeed = 5f;
	float BackwardSpeed = 2f;
	float StrafingSpeed = 3f;
	float SlideSpeed = 7f;
	float JumpSpeed = 10f;
	float Gravity = 21f;
	float TerminalVelocity = 20f;
	float SlideThreshold = 0.8f;
	float MaxControllableSlideMagnitude = 0.4f;
	Vector3 slideDirection;
	Vector3 lastMoveVector { get ; set; }
	Vector3 currentMoveVector { get ; set; }

	public NetworkPlayer theOwner;
	//float lastClientHInput = 0f;
	//float lastClientVInput = 0f;
	//float serverCurrentHInput = 0f;
	//float serverCurrentVInput = 0f;
	void Awake()
	{

		if (Network.isClient)
		{
			enabled = false;
		}

		CharacterController = GetComponent("CharacterController") as CharacterController;
	}
	[RPC]
	void SetPlayer(NetworkPlayer player)
	{
		theOwner = player;
		if (player == Network.player)
			enabled = true;
	}
	void Update()
	{
		if (theOwner != null  Network.player == theOwner)
		{
			Instance = this;
			Transform targetLookAtTransform = transform.FindChild ("targetLookAt");
			GetLocomotionInput(targetLookAtTransform);
			HandleActionInput(targetLookAtTransform);
			//float HInput = Input.GetAxis("Horizontal");
		//	float VInput = Input.GetAxis("Vertical");
			if (lastMoveVector != MoveVector)
			{
				lastMoveVector = MoveVector;
			}
			if (Network.isServer)
			{
				SendMovementInput(MoveVector);
			}
			else if (Network.isClient)
			{
				networkView.RPC("SendMovementInput", RPCMode.Server, MoveVector);
			}
		}
		if(Network.isServer)
		{
			Instance = this;

			Transform targetLookAtTransform = transform.FindChild ("targetLookAt");
			//if(Camera.main == null)
			//	return;


			UpdateMotor(targetLookAtTransform);

			/*
			Vector3 moveDirection = new Vector3(serverCurrentHInput, 0, serverCurrentVInput);
			float speed = 5;
			transform.Translate(speed * moveDirection * Time.deltaTime);
*/
		}
	}

	[RPC]
	void SendMovementInput(Vector3 MoveVector)
	{  
		currentMoveVector = MoveVector;
	//	serverCurrentHInput = HInput;
	//	serverCurrentVInput = VInput;
	}
	void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
	{
		if (stream.isWriting)
		{
			Vector3 pos = transform.position;          
			stream.Serialize(ref pos);
		}
		else
		{
			Vector3 posReceive = Vector3.zero;
			stream.Serialize(ref posReceive);
			transform.position = posReceive;
		}
	}
	public void UpdateMotor(Transform targetLookAtTransform)
	{
		
		SnapAlignCharacterWithCamera(targetLookAtTransform);
		ProcessMotion();
		
	}
	void GetLocomotionInput(Transform targetLookAtTransform)
	{
		var deadZone = 0.1f;
		VerticalVelocity = MoveVector.y;
		MoveVector = Vector3.zero;
		if(Input.GetAxis("Vertical") > deadZone || Input.GetAxis("Vertical") < -deadZone)
			MoveVector += new Vector3 (0,0,Input.GetAxis("Vertical"));
		if(Input.GetAxis("Horizontal") > deadZone || Input.GetAxis("Horizontal") < -deadZone)
			MoveVector += new Vector3 (Input.GetAxis("Horizontal"),0,0);
		DetermineCurrentMoveDirection();
	}
	void HandleActionInput(Transform targetLookAtTransform)
	{
		if(Input.GetButton("Jump"))
			Jump();
	}
	
	void ProcessMotion()
	{
		/*
			Vector3 moveDirection = new Vector3(serverCurrentHInput, 0, serverCurrentVInput);
			float speed = 5;
			transform.Translate(speed * moveDirection * Time.deltaTime);
*/
		MoveVector = transform.TransformDirection(MoveVector);
		if (MoveVector.magnitude > 1) MoveVector = Vector3.Normalize(MoveVector);
		ApplySlide();
		MoveVector *= MoveSpeed();
		MoveVector = new Vector3(currentMoveVector.x, VerticalVelocity, currentMoveVector.z);
		ApplyGravity();
		CharacterController.Move(MoveVector * Time.deltaTime);
	}
	void ApplyGravity()
	{
		if(MoveVector.y > -TerminalVelocity)
			MoveVector = new Vector3(MoveVector.x, MoveVector.y - Gravity * Time.deltaTime, MoveVector.z);
		if(CharacterController.isGrounded  MoveVector.y < -1)
			MoveVector = new Vector3(MoveVector.x, -1, MoveVector.z);
	}
	void ApplySlide()
	{
		if(!CharacterController.isGrounded)
			return;
		slideDirection = Vector3.zero;
		RaycastHit hitInfo;
		if(Physics.Raycast(transform.position + Vector3.up, Vector3.down, out hitInfo))
		{
			if(hitInfo.normal.y < SlideThreshold)
				slideDirection = new Vector3(hitInfo.normal.x, -hitInfo.normal.y, hitInfo.normal.z);
		}
		if(slideDirection.magnitude < MaxControllableSlideMagnitude)
			MoveVector += slideDirection;
		else
		{
			MoveVector = slideDirection;
		}
	}
	void Jump()
	{
		if(CharacterController.isGrounded)
			VerticalVelocity = JumpSpeed;
	}
	void SnapAlignCharacterWithCamera(Transform targetLookAtTransform)
	{
		
		if(MoveVector.x != 0 || MoveVector.z !=0)
		{
			transform.rotation = Quaternion.Euler(transform.eulerAngles.x,Camera.main.transform.eulerAngles.y,transform.eulerAngles.z);
		}
		
	}
	float MoveSpeed()
	{
		var moveSpeed = 0f;
		switch (MoveDirection)
		{
		case Direction.Stationary:
			moveSpeed = 0;
			break;
		case Direction.Forward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.Backward:
			moveSpeed = BackwardSpeed;
			break;
		case Direction.Left:
			moveSpeed = StrafingSpeed;
			break;
		case Direction.Right:
			moveSpeed = StrafingSpeed;
			break;
		case Direction.LeftForward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.RightForward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.LeftBackward:
			moveSpeed = BackwardSpeed;
			break;
		case Direction.RightBackward:
			moveSpeed = BackwardSpeed;
			break;
		}
		if(slideDirection.magnitude > 0)
			moveSpeed = SlideSpeed;
		return moveSpeed;
	}
	public enum Direction
	{
		Stationary, Forward, Backward, Left, Right,
		LeftForward, RightForward, LeftBackward, RightBackward
	}
	public Direction MoveDirection {get; set;}
	public void DetermineCurrentMoveDirection()
	{
		bool forward = false;
		bool backward = false;
		bool left = false;
		bool right = false;
		if(MoveVector.z > 0)
			forward = true;
		if(MoveVector.z < 0)
			backward = true;
		if(MoveVector.x > 0)
			right = true;
		if(MoveVector.x < 0)
			left = true;
		if(forward)
		{
			if(left)
				MoveDirection = Direction.LeftForward;
			else if(right)
				MoveDirection = Direction.RightForward;
			else
				MoveDirection = Direction.Forward;
		}
		else if(backward)
		{
			if(left)
				MoveDirection = Direction.LeftBackward;
			else if(right)
				MoveDirection = Direction.RightBackward;
			else
				MoveDirection = Direction.Backward;
		}
		else if(left)
			MoveDirection = Direction.Left;
		else if(right)
			MoveDirection = Direction.Right;
		else
			MoveDirection = Direction.Stationary;
	}

}

Ok, so i got it working a little more than it was, but still not very good.
I can spawn multiple players, they can see each each move accurately, the cameras are assigned to correct player and work fine.
problems are that now:
Jumping doesnt work.
Can’t Figure out SnapAlignCharacterToCamera (throws nullreference exception when i try)
characters move VERY slowly, and in a choppy way (I think i need client side prediction?)

my scripts as of now:
Playerhandler

using UnityEngine;
using System.Collections;

public class PlayerHandler : MonoBehaviour
{
	public static CharacterController CharacterController;
	public static PlayerHandler Instance;
	public Direction MoveDirection { get; set;}
	Vector3 MoveVector { get ; set; }
	float VerticalVelocity {get ; set; }
	float ForwardSpeed = 5f;
	float BackwardSpeed = 2f;
	float StrafingSpeed = 3f;
	float SlideSpeed = 7f;
	float JumpSpeed = 10f;
	float Gravity = 21f;
	float TerminalVelocity = 20f;
	float SlideThreshold = 0.8f;
	float MaxControllableSlideMagnitude = 0.4f;
	Vector3 slideDirection;
	Vector3 lastMoveVector { get ; set; }
	Vector3 currentMoveVector { get ; set; }
	public NetworkPlayer theOwner;
	public Transform targetLookAtTransform;
	
	void Awake()
	{
		if (Network.isClient)
		{
			enabled = false;
		}
		targetLookAtTransform = transform.FindChild ("targetLookAt");
		CharacterController = GetComponent("CharacterController") as CharacterController;
		Instance = this;
	}

	[RPC]
	void SetPlayer(NetworkPlayer player)
	{
		theOwner = player;
		if (player == Network.player)
			enabled = true;
	}
	
	void Update()
	{

		if (theOwner != null  Network.player == theOwner)
		{
			PlayerCam.UseExistingOrCreateNewMainCamera(targetLookAtTransform);
			if(Camera.main == null)
				return;
			GetLocomotionInput(/*targetLookAtTransform*/);

			//HandleActionInput(/*targetLookAtTransform*/);
			if (lastMoveVector != MoveVector)
			{
				lastMoveVector = MoveVector;
			}
			if (Network.isServer)
			{
				SendMovementInput(MoveVector);
			}
			else if (Network.isClient)
			{
				networkView.RPC("SendMovementInput", RPCMode.Server, MoveVector);
			}
		}
		if(Network.isServer)	
		{
			UpdateMotor(/*targetLookAtTransform*/);
		}
	}
	
	[RPC]
	void SendMovementInput(Vector3 MoveVector)
	{  
		currentMoveVector = MoveVector;
	}
	
	void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
	{
		if (stream.isWriting)
		{
			Vector3 pos = transform.position;
			stream.Serialize(ref pos);
		}
		else
		{
			Vector3 posReceive = Vector3.zero;
			stream.Serialize(ref posReceive);
			transform.position = posReceive;
		}
	}
	public void UpdateMotor(/*Transform targetLookAtTransform*/)
	{
		//SnapAlignCharacterWithCamera();
		ProcessMotion();
	}
	
	void GetLocomotionInput(/*Transform targetLookAtTransform*/)
	{
		var deadZone = 0.1f;
		VerticalVelocity = MoveVector.y;
		MoveVector = Vector3.zero;
		if(Input.GetAxis("Vertical") > deadZone || Input.GetAxis("Vertical") < -deadZone) MoveVector += new Vector3 (0,0,Input.GetAxis("Vertical"));
		if(Input.GetAxis("Horizontal") > deadZone || Input.GetAxis("Horizontal") < -deadZone) MoveVector += new Vector3 (Input.GetAxis("Horizontal"),0,0);
		if(Input.GetButton("Jump"))
			Jump();
		DetermineCurrentMoveDirection();
	}
	
	//void HandleActionInput(/*Transform targetLookAtTransform*/)
	//{
	//	if(Input.GetButton("Jump"))
	//		Jump();
	//}

	void ProcessMotion()
	{
		MoveVector = transform.TransformDirection(MoveVector);
		if (MoveVector.magnitude > 1) MoveVector = Vector3.Normalize(MoveVector);
		ApplySlide();
		MoveVector *= MoveSpeed();
		MoveVector = new Vector3(currentMoveVector.x, VerticalVelocity, currentMoveVector.z);
		ApplyGravity();
		CharacterController.Move(MoveVector * Time.deltaTime);
	}
	
	void ApplyGravity()
	{
		if(MoveVector.y > -TerminalVelocity)
			MoveVector = new Vector3(MoveVector.x, MoveVector.y - Gravity * Time.deltaTime, MoveVector.z);
		if(CharacterController.isGrounded  MoveVector.y < -1)
			MoveVector = new Vector3(MoveVector.x, -1, MoveVector.z);
	}
	
	void ApplySlide()
	{
		if(!CharacterController.isGrounded)
		{
			return;
		}
		slideDirection = Vector3.zero;
		RaycastHit hitInfo;
		if(Physics.Raycast(transform.position + Vector3.up, Vector3.down, out hitInfo))
		{
			if(hitInfo.normal.y < SlideThreshold)
			{
				slideDirection = new Vector3(hitInfo.normal.x, -hitInfo.normal.y, hitInfo.normal.z);
			}
		}
		if(slideDirection.magnitude < MaxControllableSlideMagnitude)
		{
			MoveVector += slideDirection;
		}
		else
		{
			MoveVector = slideDirection;
		}
	}
	
	void Jump()
	{
		if(CharacterController.isGrounded)
		{
			VerticalVelocity = JumpSpeed;
		}
	}
	
	//void SnapAlignCharacterWithCamera(/*Transform targetLookAtTransform*/)
	//{
	//	if(MoveVector.x != 0 || MoveVector.z !=0)
	//	{
	//		transform.rotation = Quaternion.Euler(transform.eulerAngles.x,Camera.main.transform.eulerAngles.y,transform.eulerAngles.z);
	//	}
	//}

	float MoveSpeed()
	{
		var moveSpeed = 0f;
		switch (MoveDirection)
		{
		case Direction.Stationary:
			moveSpeed = 0;
			break;
		case Direction.Forward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.Backward:
			moveSpeed = BackwardSpeed;
			break;
		case Direction.Left:
			moveSpeed = StrafingSpeed;
			break;
		case Direction.Right:
			moveSpeed = StrafingSpeed;
			break;
		case Direction.LeftForward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.RightForward:
			moveSpeed = ForwardSpeed;
			break;
		case Direction.LeftBackward:
			moveSpeed = BackwardSpeed;
			break;
		case Direction.RightBackward:
			moveSpeed = BackwardSpeed;
			break;
		}
		if(slideDirection.magnitude > 0)
		{
			moveSpeed = SlideSpeed;
		}
		return moveSpeed;
	}
	
	public enum Direction
	{
		Stationary, Forward, Backward, Left, Right, LeftForward, RightForward, LeftBackward, RightBackward
	}

	public void DetermineCurrentMoveDirection()
	{
		bool forward = false;
		bool backward = false;
		bool left = false;
		bool right = false;
		if(MoveVector.z > 0)
			forward = true;
		if(MoveVector.z < 0)
			backward = true;
		if(MoveVector.x > 0)
			right = true;
		if(MoveVector.x < 0)
			left = true;
		if(forward)
		{
			if(left)
				MoveDirection = Direction.LeftForward;
			else if(right)
				MoveDirection = Direction.RightForward;
			else
				MoveDirection = Direction.Forward;
		}
		else if(backward)
		{
			if(left)
				MoveDirection = Direction.LeftBackward;
			else if(right)
				MoveDirection = Direction.RightBackward;
			else
				MoveDirection = Direction.Backward;
		}
		else if(left)
			MoveDirection = Direction.Left;
		else if(right)
			MoveDirection = Direction.Right;
		else
			MoveDirection = Direction.Stationary;
	}
}

PlayerCam

using UnityEngine;
using System.Collections;

public class PlayerCam : MonoBehaviour
{
	public static PlayerCam Instance;
	public Transform TargetLookAt;
	public static void UseExistingOrCreateNewMainCamera(Transform targetLookAtTransform)
	{
		GameObject tempCamera;
		GameObject targetLookAt;
		PlayerCam myCamera;
		if(Camera.main != null)
		{
			tempCamera = Camera.main.gameObject;
		}
		else
		{
			tempCamera = new GameObject("Main Camera");
			tempCamera.AddComponent("Camera");
			tempCamera.tag = "MainCamera";
		}
		tempCamera.AddComponent("PlayerCam");
		myCamera = tempCamera.GetComponent("PlayerCam") as PlayerCam;
		targetLookAt = GameObject.Find("targetLookAt") as GameObject;
		if(targetLookAt == null)
		{
			targetLookAt = new GameObject("targetLookAt");
			targetLookAt.transform.position = Vector3.zero;
		}
		myCamera.TargetLookAt = targetLookAtTransform;
	}
	void Awake()
	{
		Instance = this;
	}

	public float X_MouseSensitivity = 5f;
	public float Y_MouseSensitivity = 5f;
	public float MouseWheelSensitivity = 5f;
	public float Y_MinLimit = -40f;
	public float Y_MaxLimit = 80f;
	public float X_Smooth = 0.05f;
	public float Y_Smooth = 0.1f;
	public float Distance = 5f;
	public float DistanceMin = 3f;
	public float DistanceMax = 10f;
	public float DistanceSmooth = 0.05f;
	public float OcclusionDistanceStep = 0.05f;
	public float DistanceResumeSmooth = 1f;
	public int MaxOcclusionChecks = 10;
	public Vector3 desiredPosition = Vector3.zero;
	private Vector3 position = Vector3.zero;
	private float startDistance = 0f;
	private float desiredDistance = 0f;
	private float velDistance = 0f;
	private float velX = 0f;
	private float velY = 0f;
	private float velZ = 0f;
	private float mouseX = 0f;
	private float mouseY = 0f;
	private float distanceSmooth = 0f;
	private float preOccludedDistance = 0;

	void Start()
	{
		Distance = Mathf.Clamp(Distance,DistanceMin,DistanceMax);
		startDistance = Distance;
		Reset ();
	}

	void LateUpdate()
	{
		if(TargetLookAt == null)
			return;
		HandlePlayerInput();
		var count = 0;
		do{
			CalculateDesiredPosition();
			count++;
		}while(CheckIfOccluded(count));
		CheckCameraPoints(TargetLookAt.position, desiredPosition);
		UpdatePosition();
	}
	void HandlePlayerInput()
	{
		var deadZone = 0.01f;
		if(Input.GetMouseButton(1)) //0=LMB;1=RMB;2=MMB
		{
			mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity;
			mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity;
		}
		mouseY = ClampAngle(mouseY, Y_MinLimit,Y_MaxLimit);
		if(Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone)
		{
			desiredDistance = Mathf.Clamp(Distance - Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity,DistanceMin,DistanceMax);
			preOccludedDistance = desiredDistance;
			distanceSmooth = DistanceSmooth;
		}
	}

	void CalculateDesiredPosition()
	{
		ResetDesiredDistance();
		Distance = Mathf.SmoothDamp(Distance, desiredDistance, ref velDistance, distanceSmooth);
		desiredPosition = CalculatePosition(mouseY, mouseX, Distance);
	}

	Vector3 CalculatePosition(float rotationX, float rotationY, float distance)
	{
		Vector3 direction = new Vector3(0, 0, -distance);
		Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0);
		return TargetLookAt.position + rotation * direction;
	}
		
	bool CheckIfOccluded(int count)
	{
		var isOccluded = false;
		var nearestDistance = CheckCameraPoints(TargetLookAt.position, desiredPosition);
		if(nearestDistance != -1)
		{
			if(count < MaxOcclusionChecks)
			{
				isOccluded = true;
				Distance -= OcclusionDistanceStep;
				if(Distance < 0.25f)
					Distance = 0.25f;
			}
			else
				
				Distance = nearestDistance - Camera.main.nearClipPlane;
			desiredDistance = Distance;
			distanceSmooth= DistanceResumeSmooth;
		}
		return isOccluded;
	}

	public struct ClipPlanePoints
	{
		public Vector3 UpperLeft;
		public Vector3 LowerLeft;
		public Vector3 UpperRight;
		public Vector3 LowerRight;
	}

	public static float ClampAngle(float angle, float min, float max)
	{
		do
		{
			if (angle < -360)
				angle += 360;
			if (angle > 360)
				angle -= 360;
		}
		while(angle < -360 || angle > 360);
		return Mathf.Clamp(angle, min, max);
	}

	public static ClipPlanePoints ClipPlaneAtNear(Vector3 pos)
	{
		var clipPlanePoints = new ClipPlanePoints();
		if(Camera.main == null)
			return clipPlanePoints;
		var transform = Camera.main.transform;
		var HalfFOV = (Camera.main.fieldOfView / 2) * Mathf.Deg2Rad;
		var aspect = Camera.main.aspect;
		var distance = Camera.main.nearClipPlane;
		var height = distance * Mathf.Tan(HalfFOV);
		var width = height * aspect;
		clipPlanePoints.LowerRight = pos + transform.right * width;
		clipPlanePoints.LowerRight -= transform.up * height;
		clipPlanePoints.LowerRight += transform.forward * distance;
		
		clipPlanePoints.LowerLeft = pos - transform.right * width;
		clipPlanePoints.LowerLeft -= transform.up * height;
		clipPlanePoints.LowerLeft += transform.forward * distance;
		
		clipPlanePoints.UpperRight = pos + transform.right * width;
		clipPlanePoints.UpperRight += transform.up * height;
		clipPlanePoints.UpperRight += transform.forward * distance;
		
		clipPlanePoints.UpperLeft = pos - transform.right * width;
		clipPlanePoints.UpperLeft += transform.up * height;
		clipPlanePoints.UpperLeft += transform.forward * distance;
		return clipPlanePoints;
	}

	float CheckCameraPoints(Vector3 from, Vector3 to)
	{
		var nearDistance = -1f;
		RaycastHit hitInfo;
		ClipPlanePoints clipPlanePoints = ClipPlaneAtNear(to);
		Debug.DrawLine(from, to + transform.forward * -camera.nearClipPlane, Color.red);
		Debug.DrawLine(from, clipPlanePoints.UpperLeft, Color.red);
		Debug.DrawLine(from, clipPlanePoints.LowerLeft, Color.red);
		Debug.DrawLine(from, clipPlanePoints.UpperRight, Color.red);
		Debug.DrawLine(from, clipPlanePoints.LowerRight, Color.red);
		Debug.DrawLine(clipPlanePoints.UpperLeft, clipPlanePoints.UpperRight);
		Debug.DrawLine(clipPlanePoints.UpperLeft, clipPlanePoints.LowerRight, Color.red);
		Debug.DrawLine(clipPlanePoints.UpperRight, clipPlanePoints.LowerRight);
		Debug.DrawLine(clipPlanePoints.UpperRight, clipPlanePoints.LowerLeft, Color.red);
		Debug.DrawLine(clipPlanePoints.LowerRight, clipPlanePoints.LowerLeft);
		Debug.DrawLine(clipPlanePoints.LowerLeft, clipPlanePoints.UpperLeft);
		Debug.DrawLine(clipPlanePoints.UpperLeft, to + transform.forward * -camera.nearClipPlane, Color.red);
		Debug.DrawLine(clipPlanePoints.UpperRight, to + transform.forward * -camera.nearClipPlane, Color.red);
		Debug.DrawLine(clipPlanePoints.LowerLeft, to + transform.forward * -camera.nearClipPlane, Color.red);
		Debug.DrawLine(clipPlanePoints.LowerRight, to + transform.forward * -camera.nearClipPlane, Color.red);
		if(Physics.Linecast(from, clipPlanePoints.UpperLeft, out hitInfo)  hitInfo.collider.tag != "Player")
			nearDistance = hitInfo.distance;
		if(Physics.Linecast(from, clipPlanePoints.LowerLeft, out hitInfo)  hitInfo.collider.tag != "Player")
			if(hitInfo.distance < nearDistance || nearDistance == -1)
				nearDistance = hitInfo.distance;
		if(Physics.Linecast(from, clipPlanePoints.UpperRight, out hitInfo)  hitInfo.collider.tag != "Player")
			if(hitInfo.distance < nearDistance || nearDistance == -1)
				nearDistance = hitInfo.distance;
		if(Physics.Linecast(from, clipPlanePoints.LowerRight, out hitInfo)  hitInfo.collider.tag != "Player")
			if(hitInfo.distance < nearDistance || nearDistance == -1)
				nearDistance = hitInfo.distance;
		if(Physics.Linecast(from, to + transform.forward * -camera.nearClipPlane, out hitInfo)  hitInfo.collider.tag != "Player")
		if(hitInfo.distance < nearDistance || nearDistance == -1)
				nearDistance = hitInfo.distance;
		
		return nearDistance;
	}

	void ResetDesiredDistance()
	{
		if(desiredDistance  < preOccludedDistance)
		{
			var pos = CalculatePosition(mouseY, mouseX, preOccludedDistance);
			var nearestDistance = CheckCameraPoints(TargetLookAt.position, pos);
			if(nearestDistance == -1 || nearestDistance > preOccludedDistance)
			{
				desiredDistance = preOccludedDistance;
			}
		}
	}

	void UpdatePosition()
	{
		var posX = Mathf.SmoothDamp(position.x, desiredPosition.x, ref velX, X_Smooth);
		var posY = Mathf.SmoothDamp(position.y, desiredPosition.y, ref velY, Y_Smooth);
		var posZ = Mathf.SmoothDamp(position.z, desiredPosition.z, ref velZ, X_Smooth);
		position = new Vector3(posX, posY, posZ);
		transform.position = position;
		transform.LookAt(TargetLookAt);
	}

	public void Reset()
	{
		mouseX = 0;
		mouseY = 10;
		Distance = startDistance;
		desiredDistance = Distance;
		preOccludedDistance = Distance;
	}
}

could somebody please offer some help or advice? I’m going to keep tinkering and see what I can do myself, although I don’t think I’ll get very much farther without some input from you professionals out there.

EDIT: btw, with the above codes like that, I’m not getting any errors/warnings in the output logs of either client or server, just a LOT of state updates.

EDIT2: also, i’m not sure if slide works or not I haven’t tried i’m too busy with the other things wrong with it
please help.

EDIT3 not sure, but while testing what I have with two clients, one in the unity editor gameport and one in standalone client, my unity froze and i had to end task. idk what could be causing that. maybe the large number of state updates?