private void ReceiveDataCallback(IAsyncResult result) { try { int byteLength = stream.EndRead(result); if (byteLength <= 0) { metaMonoBehaviours.applicationCallbacks.ScheduleFixedUpdateAction(() => playersManager.DisconnectPlayer(playerId)); return; } byte[] data = new byte[byteLength]; Array.Copy(receiveBuffer, data, byteLength); bool shouldReset = HandleData(data, (packetTypeId, packet) => packetsReceiver.ProcessPacket(playerId, packetTypeId, packet, true)); receivePacket.Reset(shouldReset); stream.BeginRead(receiveBuffer, 0, DataBufferSize, ReceiveDataCallback, null); } catch (Exception exception) { Logger.LogError(LoggerSection.Network, $"Error receiving TCP data: {exception}"); metaMonoBehaviours.applicationCallbacks.ScheduleFixedUpdateAction(() => playersManager.DisconnectPlayer(playerId)); } }