When player dead force spectate mode but crashedSolved

i'm trying to make Spectate plugin when user dead instantly spectate to player

here's my code

        private void StartSpectating(BasePlayer player, BasePlayer target)
        {
            if (!player.IsSpectating())
            {
                player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, true);
                player.gameObject.SetLayerRecursive(10);
                player.CancelInvoke("MetabolismUpdate");
                player.CancelInvoke("InventoryUpdate");
                player.ClearEntityQueue();
                player.SendEntitySnapshot(target);
                player.gameObject.Identity();
                player.SetParent(target, 0);
                if (!SpectatedList.ContainsKey(target))
                {
                    SpectatedList.Add(target, new List<BasePlayer>());
                }
                if (!SpectatedList[target].Contains(player))
                {
                    SpectatedList[target].Add(player);
                }
            }
        }
        private void EndSpectating(BasePlayer player)
        {
            if (player.IsSpectating())
            {
                player.SetParent(null, 0);
                player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, false);
                player.gameObject.SetLayerRecursive(17);
                player.metabolism.Reset();
                player.InvokeRepeating("InventoryUpdate", 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));
            }
        }​

this code for spectate player
codeflow when endround
1. EndSpectating on all players
2.

  player.inventory.containerMain?.Clear();
            player.inventory.containerWear?.Clear();
            player.inventory.containerBelt?.Clear();
            ItemManager.DoRemoves();

3.

  player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
            player.InitializeHealth(player.MaxHealth(), player.MaxHealth());
            player.metabolism.calories.value = player.metabolism.calories.max;
            player.metabolism.hydration.value = player.metabolism.hydration.max;
            player.metabolism.bleeding.value = 0;
            player.metabolism.radiation_level.value = 0;
            player.metabolism.radiation_poison.value = 0;
            player.metabolism.SendChangesToClient();
            player.SendNetworkUpdateImmediate();

4.

  public void Teleport(BasePlayer player, Vector3 destination, bool checkGround = false, bool sleep = true)
        {
            if (player.IsNpc || destination.Equals(Vector3.zero))
                return;

            
            if (player.isMounted)
                player.GetMounted().DismountPlayer(player, true);

            if (player.GetParentEntity() != null)
                player.SetParent(null);

            if (checkGround)
                destination = GetGroundPosition(destination);
            TeleportingPlayers.Add(player.userID);
            timer.Once(2, () =>
            {
                TeleportingPlayers.Remove(player.userID);
            });
            if (sleep)
            {
                player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
                player.MovePosition(destination);
                player.UpdateNetworkGroup();
                if (player.inventory != null && player.inventory.containerMain != null && player.inventory.containerBelt != null && player.inventory.containerWear != null)
                    player.StartSleeping();
                player.SendNetworkUpdateImmediate(false);
                player.ClearEntityQueue(null);
                player.ClientRPCPlayer(null, player, "StartLoading");
                if (player.net?.subscriber?.subscribed != null)
                    player.SendFullSnapshot();
            }
            else
            {
                player.MovePosition(destination);
                player.ClientRPCPlayer(null, player, "ForcePositionTo", destination);
                player.SendNetworkUpdateImmediate();
                player.ClearEntityQueue(null);
            }
        }

when finished game round all players teleport to custom spawn point 
i think crashed on teleport 

here's crash log 
 i try use BasePlayer.StartSpectating  and BasePlayer.UpdateSpectateTarget code too but same error on teleport
NullReferenceException: Object reference not set to an instance of an object.
Disconnected (Object reference not set to an instance of an object.
at BaseNetworkable.OnNetworkGroupChange () [0x00000] in <00000000000000000000000000000000>:0
at Network.Networkable.SwitchGroup (Network.Visibility.Group newGroup) [0x00000] in <00000000000000000000000000000000>:0
at Client.OnGroupChange (Network.Message msg) [0x00000] in <00000000000000000000000000000000>:0
at Client.OnNetworkMessage (Network.Message packet) [0x00000] in <00000000000000000000000000000000>:0
at Facepunch.Network.Raknet.Client.HandleMessage () [0x00000] in <00000000000000000000000000000000>:0
at Facepunch.Network.Raknet.Client.Cycle () [0x00000] in <00000000000000000000000000000000>:0
at Client.Update () [0x00000] in <00000000000000000000000000000000>:0 ) - returning to main menu

​

i added BasePlayer.Respawn code before stop spectate is it resolved

Locked automatically