Пример #1
0
        public static void OnUserDisconnected(uLink.NetworkPlayer player, ConnectionAcceptor CA)
        {
            try
            {
                if (CA != null)
                {
                    if (player != null)
                    {
                        object localData = player.GetLocalData();
                        if (localData != null)
                        {
                            RustServerManagement RSM = RustServerManagement.Get();
                            if (localData is NetUser)
                            {
                                NetUser user = (NetUser)localData;
                                PlayerClient playerClient = user.playerClient;
                                List<PlayerClient> possibleClient = new List<PlayerClient>();
                                try
                                {
                                    if (playerClient == null || playerClient.netUser == null || playerClient.netPlayer == null || playerClient.userName == null)
                                        possibleClient = Array.FindAll(AllPlayerClients.ToArray(), (PlayerClient pc) => pc.netUser == user || pc.userID == user.userID || pc.netPlayer == user.networkPlayer || pc.netPlayer == player).ToList();

                                    if (possibleClient.Count() == 1)
                                        playerClient = possibleClient[0];

                                    if (possibleClient.Count == 0 || playerClient == null || playerClient.netUser == null || playerClient.netPlayer == null || playerClient.userName == null)
                                    {
                                        possibleClient.Clear();
                                        LockedList<PlayerClient> playerClients = PlayerClient.All;
                                        possibleClient = Array.FindAll(playerClients.ToArray(), (PlayerClient pc) => pc.netUser == user || pc.userID == user.userID || pc.netPlayer == user.networkPlayer || pc.netPlayer == player).ToList();
                                    }

                                    if (possibleClient.Count() == 1)
                                        playerClient = possibleClient[0];

                                    if (possibleClient.Count == 0 || playerClient == null || playerClient.netUser == null || playerClient.netPlayer == null || playerClient.userName == null)
                                    {
                                        possibleClient.Clear();
                                        List<PlayerClient> playerClients = RSM._playerClientList;
                                        possibleClient = Array.FindAll(playerClients.ToArray(), (PlayerClient pc) => pc.netUser == user || pc.userID == user.userID || pc.netPlayer == user.networkPlayer || pc.netPlayer == player).ToList();
                                    }

                                    if (possibleClient.Count() == 1)
                                        playerClient = possibleClient[0];

                                    if (possibleClient.Count == 0 || playerClient == null || playerClient.netUser == null || playerClient.netPlayer == null || playerClient.userName == null)
                                        playerClient = null;

                                    if (playerClient == null)
                                        conLog.Error("Could not find a proper playerclient after many tries!");
                                }
                                catch (Exception ex)
                                {
                                    conLog.Error("Could not find a proper playerclient: " + ex.ToString());
                                }

                                if (user != null && playerClient != null)
                                {
                                    if (latestPM.ContainsKey(playerClient))
                                        latestPM.Remove(playerClient);

                                    if (latestRequests.ContainsKey(playerClient))
                                        latestRequests.Remove(playerClient);

                                    if (latestFactionRequests.ContainsKey(playerClient))
                                        latestFactionRequests.Remove(playerClient);

                                    if (killList.Contains(playerClient))
                                        killList.Remove(playerClient);

                                    if (isTeleporting.Contains(playerClient))
                                        isTeleporting.Remove(playerClient);

                                    if (isAccepting.Contains(playerClient))
                                        isAccepting.Remove(playerClient);

                                    if (wasHit.Contains(playerClient))
                                        wasHit.Remove(playerClient);

                                    if (inSafeZone.ContainsKey(playerClient))
                                        inSafeZone.Remove(playerClient);

                                    if (inWarZone.ContainsKey(playerClient))
                                        inWarZone.Remove(playerClient);

                                    if (firstPoints.ContainsKey(playerClient))
                                        firstPoints.Remove(playerClient);

                                    if (secondPoints.ContainsKey(playerClient))
                                        secondPoints.Remove(playerClient);

                                    if (blockedRequestsPer.ContainsKey(playerClient.userID.ToString()))
                                    {
                                        if (blockedRequestsPer[playerClient.userID.ToString()].Count < 1)
                                            blockedRequestsPer.Remove(playerClient.userID.ToString());
                                    }

                                    if (teleportRequests.ContainsKey(playerClient))
                                        teleportRequests.Remove(playerClient);

                                    if (AllPlayerClients.Contains(playerClient))
                                        AllPlayerClients.Remove(playerClient);

                                    string leaveMessage = "";
                                    if (Vars.enableLeave && !Vars.kickQueue.Contains(playerClient.userID.ToString()) && playerClient.userName.Length > 0)
                                    {
                                        leaveMessage = Vars.leaveMessage.Replace("$USER$", Vars.filterFullNames(playerClient.userName, playerClient.userID.ToString()));
                                        Broadcast.broadcastJoinLeave(leaveMessage);
                                        Vars.conLog.Chat("<BROADCAST ALL> " + Vars.botName + ": " + leaveMessage);
                                    }

                                    user.connection.netUser = null;
                                    CA.m_Connections.Remove(user.connection);
                                    bool b = true;
                                    if (Vars.kickQueue.Contains(playerClient.userID.ToString()) || playerClient.userName.Length == 0)
                                    {
                                        if (Vars.kickQueue.Contains(playerClient.userID.ToString()))
                                            Vars.kickQueue.Remove(playerClient.userID.ToString());
                                        b = false;
                                    }
                                    try
                                    {
                                        if (playerClient != null)
                                        {
                                            if (user == null)
                                                user = playerClient.netUser;
                                            if (user != null)
                                            {
                                                try
                                                {
                                                    Controllable controllable = playerClient.controllable;
                                                    if (controllable != null)
                                                    {
                                                        Character forCharacter = controllable.character;
                                                        try
                                                        {
                                                            RSM.SaveAvatar(forCharacter);
                                                        }
                                                        catch (Exception exception)
                                                        {
                                                            conLog.Error("SA: " + exception);
                                                        }
                                                        if (forCharacter != null)
                                                        {
                                                            try
                                                            {
                                                                RSM.ShutdownAvatar(forCharacter);
                                                            }
                                                            catch (Exception exception)
                                                            {
                                                                conLog.Error("SDA: " + exception);
                                                            }
                                                            try
                                                            {
                                                                Character.DestroyCharacter(forCharacter);
                                                            }
                                                            catch (Exception exception)
                                                            {
                                                                conLog.Error("CDC: " + exception);
                                                            }
                                                        }
                                                    }
                                                    try
                                                    {
                                                        RSM._playerClientList.Remove(playerClient);
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        conLog.Error("COULD NOT REMOEVE PLAYERCLIENT FROM LIST: " + ex.ToString());
                                                    }
                                                }
                                                catch (Exception ex)
                                                {
                                                    conLog.Error("ECFC: " + ex.ToString());
                                                }
                                            }
                                            else
                                                conLog.Info("COULD NOT EARSE CHARACTERS FOR CLIENT!");
                                        }
                                        if (player == null)
                                            player = playerClient.netPlayer;
                                        if (player != null)
                                            NetCull.DestroyPlayerObjects(player);
                                        else
                                            conLog.Info("COULD NOT DESTROY PLAYER OBJECTS!");
                                        if (user == null)
                                            user = playerClient.netUser;
                                        if (user != null)
                                            CullGrid.ClearPlayerCulling(user);
                                        else
                                            conLog.Info("COULD NOT CLEAR PLAYER CULLING!");
                                        if (player == null)
                                            player = playerClient.netPlayer;
                                        if (player != null)
                                            NetCull.RemoveRPCs(player);
                                        else
                                            conLog.Info("COULD NOT REMOVE RPCS!");
                                    }
                                    catch (Exception exception)
                                    {
                                        conLog.Error("#1: " + exception.ToString());
                                        conLog.Error("DO NOT IGNORE THE ERROR ABOVE. THESE THINGS SHOULD NOT BE FAILING. EVER.");
                                    }
                                    if (b)
                                        conLog.Info("Player " + user.displayName + " (" + user.userID + ") disconnected. Data unloaded.");
                                    Rust.Steam.Server.OnUserLeave(user.connection.UserID);
                                    try
                                    {
                                        user.Dispose();
                                    }
                                    catch (Exception exception2)
                                    {
                                        conLog.Error("#2: " + exception2.ToString());
                                        conLog.Error("DO NOT IGNORE THE ERROR ABOVE. THESE THINGS SHOULD NOT BE FAILING. EVER.");
                                    }
                                }
                                else
                                {
                                    conLog.Error("So... A user disconnected but his/her NetUser/PlayerClient was null... Shit. Things will break due to this.");
                                    LockedList<PlayerClient> playerClients = PlayerClient.All;
                                    foreach (PlayerClient pc in playerClients)
                                    {
                                        if (!AllPlayerClients.Contains(pc))
                                        {
                                            conLog.Error("Fixing the issue with the PlayerClient...");
                                            try
                                            {
                                                if (latestPM.ContainsKey(playerClient))
                                                    latestPM.Remove(playerClient);

                                                if (latestRequests.ContainsKey(playerClient))
                                                    latestRequests.Remove(playerClient);

                                                if (latestFactionRequests.ContainsKey(playerClient))
                                                    latestFactionRequests.Remove(playerClient);

                                                if (killList.Contains(playerClient))
                                                    killList.Remove(playerClient);

                                                if (isTeleporting.Contains(playerClient))
                                                    isTeleporting.Remove(playerClient);

                                                if (isAccepting.Contains(playerClient))
                                                    isAccepting.Remove(playerClient);

                                                if (wasHit.Contains(playerClient))
                                                    wasHit.Remove(playerClient);

                                                if (inSafeZone.ContainsKey(playerClient))
                                                    inSafeZone.Remove(playerClient);

                                                if (inWarZone.ContainsKey(playerClient))
                                                    inWarZone.Remove(playerClient);

                                                if (firstPoints.ContainsKey(playerClient))
                                                    firstPoints.Remove(playerClient);

                                                if (secondPoints.ContainsKey(playerClient))
                                                    secondPoints.Remove(playerClient);

                                                if (blockedRequestsPer.ContainsKey(playerClient.userID.ToString()))
                                                {
                                                    if (blockedRequestsPer[playerClient.userID.ToString()].Count < 1)
                                                        blockedRequestsPer.Remove(playerClient.userID.ToString());
                                                }

                                                if (teleportRequests.ContainsKey(playerClient))
                                                    teleportRequests.Remove(playerClient);

                                                if (AllPlayerClients.Contains(playerClient))
                                                    AllPlayerClients.Remove(playerClient);

                                                string leaveMessage = "";
                                                if (Vars.enableLeave && !Vars.kickQueue.Contains(playerClient.userID.ToString()) && playerClient.userName.Length > 0)
                                                {
                                                    leaveMessage = Vars.leaveMessage.Replace("$USER$", Vars.filterFullNames(playerClient.userName, playerClient.userID.ToString()));
                                                    Broadcast.broadcastJoinLeave(leaveMessage);
                                                    Vars.conLog.Chat("<BROADCAST ALL> " + Vars.botName + ": " + leaveMessage);
                                                }

                                                user.connection.netUser = null;
                                                CA.m_Connections.Remove(user.connection);
                                                bool b = true;
                                                if (Vars.kickQueue.Contains(playerClient.userID.ToString()) || playerClient.userName.Length == 0)
                                                {
                                                    if (Vars.kickQueue.Contains(playerClient.userID.ToString()))
                                                        Vars.kickQueue.Remove(playerClient.userID.ToString());
                                                    b = false;
                                                }
                                                try
                                                {
                                                    if (playerClient != null)
                                                    {
                                                        RSM.EraseCharactersForClient(playerClient, true, user);
                                                    }
                                                    NetCull.DestroyPlayerObjects(player);
                                                    CullGrid.ClearPlayerCulling(user);
                                                    NetCull.RemoveRPCs(player);
                                                }
                                                catch (Exception exception)
                                                {
                                                    conLog.Error("#3: " + exception.ToString());
                                                    conLog.Error("DO NOT IGNORE THE ERROR ABOVE. THESE THINGS SHOULD NOT BE FAILING. EVER.");
                                                }
                                                if (b)
                                                    conLog.Info("Player " + user.displayName + " (" + user.userID + ") disconnected. Data unloaded.");
                                                Rust.Steam.Server.OnUserLeave(user.connection.UserID);
                                                try
                                                {
                                                    user.Dispose();
                                                }
                                                catch (Exception exception2)
                                                {
                                                    conLog.Error("#4: " + exception2.ToString());
                                                    conLog.Error("DO NOT IGNORE THE ERROR ABOVE. THESE THINGS SHOULD NOT BE FAILING. EVER.");
                                                }
                                            }
                                            catch (Exception ex)
                                            {
                                                conLog.Error("Something went TERRIBLY TERRIBLY wrong. Contact MistaD ASAP. Send him this: " + ex.ToString());
                                            }
                                        }
                                    }
                                }
                            }
                            else if (localData is ClientConnection)
                            {
                                ClientConnection item = (ClientConnection)localData;
                                CA.m_Connections.Remove(item);
                                ConsoleSystem.Print("User Disconnected: (unconnected " + player.ipAddress + ")", false);
                            }

                            player.SetLocalData(null);
                            Rust.Steam.Server.OnPlayerCountChanged();
                        }
                        else
                            conLog.Error("User attempted to disconnect but the localData was corrupted.");
                    }
                    else
                        conLog.Error("User attempted to disconnect but the NetworkPlayer was corrupted.");
                }
            }
            catch (Exception ex)
            {
                Vars.conLog.Error("OUD: " + ex.ToString());
            }
        }