public void Disconnect(uint playerID, ChunkMPlayer player)
        {
            Race race = GetRace(playerID);

            if (race != null)
            {
                race.RemovePlayer(playerID, $"Player #{playerID} disconnected.");
            }
        }
            public void Move(uint playerID, int index, GhostNetFrame frame = null)
            {
                Logger.Log(LogLevel.Verbose, "ghostnet-race", $"Moving player {playerID} to index {index}");
                GhostNetConnection con = Manager.Server.Connections[(int)playerID];
                ChunkMPlayer       playerCached;

                if (con == null || !Manager.Server.PlayerMap.TryGetValue(playerID, out playerCached) || playerCached == null)
                {
                    return;
                }
                Indices[playerID] = index;
                if (index == -1 && WaitingForStart.Contains(playerID) && string.IsNullOrEmpty(playerCached.SID))
                {
                    WaitingForStart.Remove(playerID);
                    return;
                }

                ChunkMPlayer player = new ChunkMPlayer {
                    Name  = playerCached.Name,
                    SID   = index == -1 ? "" : Areas[index].Item1,
                    Mode  = index == -1 ? AreaMode.Normal : Areas[index].Item2,
                    Level = ""
                };

                if (frame == null)
                {
                    con.SendManagement(new GhostNetFrame {
                        HHead = new ChunkHHead {
                            PlayerID = playerID
                        },

                        MPlayer = player
                    }, true);
                }
                else
                {
                    frame.MPlayer    = player;
                    frame.PropagateM = true;
                }
            }