public void OnDisconnected(IConnection conn, MpDisconnectReason reason)
        {
            if (conn.State == ConnectionStateEnum.Disconnected)
            {
                return;
            }

            ServerPlayer player = conn.serverPlayer;

            players.Remove(player);

            if (player.IsPlaying)
            {
                if (!players.Any(p => p.FactionId == player.FactionId))
                {
                    byte[] data = ByteWriter.GetBytes(player.FactionId);
                    SendCommand(CommandType.FactionOffline, ScheduledCommand.NoFaction, ScheduledCommand.Global, data);
                }

                SendNotification("MpPlayerDisconnected", conn.username);
                SendChat($"{conn.username} has left.");

                SendToAll(Packets.Server_PlayerList, new object[] { (byte)PlayerListAction.Remove, player.id });
            }

            conn.State = ConnectionStateEnum.Disconnected;

            MpLog.Log($"Disconnected ({reason}): {conn}");
        }
Example #2
0
 public override void Close(MpDisconnectReason reason, byte[] data)
 {
     if (State != ConnectionStateEnum.ClientSteam)
     {
         Send(Packets.Special_Steam_Disconnect, GetDisconnectBytes(reason, data));
     }
 }
        public void HandleDisconnectReason(MpDisconnectReason reason, byte[] data)
        {
            var reader = new ByteReader(data);
            string reasonKey = null;
            string descKey = null;

            if (reason == MpDisconnectReason.Generic) reasonKey = reader.ReadString();

            if (reason == MpDisconnectReason.Protocol) { reasonKey = "MpWrongProtocol"; descKey = "MpWrongModVersionInfo"; }
            if (reason == MpDisconnectReason.UsernameLength) { reasonKey = "MpInvalidUsernameLength"; descKey = "MpChangeUsernameInfo"; }
            if (reason == MpDisconnectReason.UsernameChars) { reasonKey = "MpInvalidUsernameChars"; descKey = "MpChangeUsernameInfo"; }
            if (reason == MpDisconnectReason.UsernameAlreadyOnline) { reasonKey = "MpInvalidUsernameAlreadyPlaying"; descKey = "MpChangeUsernameInfo"; }
            if (reason == MpDisconnectReason.ServerClosed) reasonKey = "MpServerClosed";
            if (reason == MpDisconnectReason.ServerFull) reasonKey = "MpServerFull";
            if (reason == MpDisconnectReason.Kick) reasonKey = "MpKicked";

            if (reason == MpDisconnectReason.Defs)
            {
                foreach (var local in mods.defInfo)
                    local.Value.status = (DefCheckStatus)reader.ReadByte();
            }

            disconnectReason = reason;
            disconnectReasonKey = reasonKey?.Translate();
            disconnectInfo = descKey?.Translate();
        }
 public void Disconnect(MpDisconnectReason reason, byte[] data = null)
 {
     conn.Close(reason, data);
     Server.OnDisconnected(conn, reason);
 }
Example #5
0
        public void HandleDisconnectReason(MpDisconnectReason reason, byte[] data)
        {
            var    reader    = new ByteReader(data);
            string reasonKey = null;
            string descKey   = null;

            if (reason == MpDisconnectReason.Generic)
            {
                reasonKey = reader.ReadString();
            }

            if (reason == MpDisconnectReason.Protocol)
            {
                reasonKey = "MpWrongProtocol";

                string strVersion = data.Length != 0 ? reader.ReadString() : "0.4.2";
                int    proto      = data.Length != 0 ? reader.ReadInt32() : 11;

                disconnectInfo = "MpWrongMultiplayerVersionInfo".Translate(strVersion, proto);
            }

            if (reason == MpDisconnectReason.UsernameLength)
            {
                reasonKey = "MpInvalidUsernameLength"; descKey = "MpChangeUsernameInfo";
            }
            if (reason == MpDisconnectReason.UsernameChars)
            {
                reasonKey = "MpInvalidUsernameChars"; descKey = "MpChangeUsernameInfo";
            }
            if (reason == MpDisconnectReason.UsernameAlreadyOnline)
            {
                reasonKey = "MpInvalidUsernameAlreadyPlaying"; descKey = "MpChangeUsernameInfo";
            }
            if (reason == MpDisconnectReason.ServerClosed)
            {
                reasonKey = "MpServerClosed";
            }
            if (reason == MpDisconnectReason.ServerFull)
            {
                reasonKey = "MpServerFull";
            }
            if (reason == MpDisconnectReason.Kick)
            {
                reasonKey = "MpKicked";
            }

            if (reason == MpDisconnectReason.Defs)
            {
                foreach (var local in mods.defInfo)
                {
                    var status = (DefCheckStatus)reader.ReadByte();
                    local.Value.status = status;

                    if (MultiplayerMod.arbiterInstance && status != DefCheckStatus.OK)
                    {
                        Log.Message($"{local.Key}: {status}");
                    }
                }
            }

            disconnectReason    = reason;
            disconnectReasonKey = reasonKey?.Translate();
            disconnectInfo      = disconnectInfo ?? descKey?.Translate();
        }
Example #6
0
 public override void Close(MpDisconnectReason reason, byte[] data)
 {
     peer.NetManager.TriggerUpdate(); // todo: is this needed?
     peer.NetManager.DisconnectPeer(peer, GetDisconnectBytes(reason, data));
 }
Example #7
0
 public override void Close(MpDisconnectReason reason, byte[] data)
 {
 }