private IEnumerator <IYieldInstruction> TelemtrySpeedFilter()
        {
            float time = 0.0f;

            while (time < (TELEMETRY_UPDATE_RATE + TELEMETRY_SPEED_FILTER_PADDING))
            {
                time += Time.deltaTime;
                yield return(new YieldUntilNextFrame());
            }
            if (this.StateMachine.CurrentState is DefaultForeignAvatarState)
            {
                DefaultForeignAvatarState state = (DefaultForeignAvatarState)this.StateMachine.CurrentState;
                state.SetCurrentAvatarSpeed(0.0f);
            }
        }
        private void ReceiveEmote(Message message)
        {
            // Parse out the emote info to load from the repo to make sure the emote is loaded before we try to play it.
            XmlDocument emoteDoc = new XmlDocument();

            emoteDoc.LoadXml((string)message.Data[0]);
            XmlNode         emoteNode = emoteDoc.SelectSingleNode("Asset");
            ClientAssetInfo emoteInfo = new ClientAssetInfo(emoteNode);

            GameFacade.Instance.RetrieveProxy <ClientAssetRepository>().GetAsset <RigAnimationAsset>(emoteInfo, delegate(RigAnimationAsset rigAnimationAsset)
            {
                if (this.StateMachine.CurrentState is DefaultForeignAvatarState)
                {
                    DefaultForeignAvatarState state = (DefaultForeignAvatarState)this.StateMachine.CurrentState;
                    state.PlayEmote(rigAnimationAsset.AnimationName.ToString());
                }
            });
        }
        protected override void AvatarEntityLoadedCallback(AvatarEntity avatar)
        {
            base.AvatarEntityLoadedCallback(avatar);

            this.Entity = avatar;

            IState avatarStartState = new DefaultForeignAvatarState(avatar as ForeignAvatarEntity);

            this.StateMachine.CurrentState.AddTransition(avatarStartState);
            this.StateMachine.TransitionToState(avatarStartState);

            // TODO: This next line might not be doing anything.
            mAvatar.SetActiveRecursively(true);

            GameFacade.Instance.RetrieveMediator <AvatarMediator>().RegisterForeignAvatar(this.AvatarEntity, this.DistributedObjectId);

            base.AvatarEntityLoadedRunBufferedMessages();
        }
        private IEnumerator <IYieldInstruction> DeadReckonTelemetry(Vector3 position, Quaternion rotation)
        {
            float   step = 1.0f / (TELEMETRY_UPDATE_RATE * 1.1f);
            Vector3 lastFixedUpdatePosition;


            for (float time = 0.0f; time < (TELEMETRY_UPDATE_RATE * 1.1f); time += Time.fixedDeltaTime)
            {
                float t = time * step;

                lastFixedUpdatePosition = this.Entity.UnityGameObject.transform.position;

                yield return(new YieldUntilNextFrame());

                this.Entity.UnityGameObject.transform.position = Vector3.Lerp(mLastPosition, position, t);
                this.Entity.UnityGameObject.transform.rotation = Quaternion.Slerp(mLastRotation, rotation, t);

                if (this.StateMachine.CurrentState is DefaultForeignAvatarState)
                {
                    DefaultForeignAvatarState state = (DefaultForeignAvatarState)this.StateMachine.CurrentState;

                    // Add this frame's speed to the list of recent speeds
                    float thisFrameSpeed = (lastFixedUpdatePosition - this.Entity.UnityGameObject.transform.position).magnitude / Time.fixedDeltaTime;

                    mSpeeds.Add(thisFrameSpeed);
                    if (mSpeeds.Count > mSpeedWindow)
                    {
                        mSpeeds.RemoveAt(0);
                    }

                    // Average the speeds
                    float smoothSpeed = 0.0f;
                    foreach (float speed in mSpeeds)
                    {
                        smoothSpeed += speed;
                    }
                    smoothSpeed /= (float)mSpeeds.Count;

                    state.SetCurrentAvatarSpeed(smoothSpeed);
                }

                lastFixedUpdatePosition = this.Entity.UnityGameObject.transform.position;
            }
        }