private void GetAvatarServiceResponse(XmlNode avatarXmlNode, string nickname, Guid sessionId, ZoneId zoneId, Action <bool> gotAvatarServiceResponse) { List <ItemId> itemIds = null; AvatarId avatarId; try { if (AvatarXmlUtil.GetAvatarInfoFromAvatarXmlNode(avatarXmlNode, out avatarId, out itemIds)) { Dna savedDna = mServerAssetRepository.GetDna(itemIds); // Create an updated dna by starting with the reference dna and updating it with the savedDna GetReferenceAvatar(delegate(Dna referenceAvatarDna) { Dna avatarDna = new Dna(mReferenceAvatarDna); avatarDna.UpdateDna(savedDna); // TODO? If UpdateDna overwrites something or fills in missing data we should save the dna back to the db // Get xml from updated avatar dna XmlDocument dnaXml = mServerAssetRepository.GetXmlDna(avatarDna.GetItemIdList()); DistributedObjectId distributedObjectId = mDistributedObjectIdManager.GetNewId(); ServerAccount serverAccount = mServerStateMachine.SessionManager.GetServerAccountFromSessionId(sessionId); ServerDistributedAvatar serverDistributedAvatar = new ServerDistributedAvatar(distributedObjectId, avatarId, sessionId, nickname, dnaXml, serverAccount, mServerObjectRepository, mServerAssetRepository); //register object with object repository mServerObjectRepository.AddObjectToSessionId(sessionId, serverDistributedAvatar); //register object with session manager mServerEngine.ProcessZoneChange(serverDistributedAvatar, zoneId); gotAvatarServiceResponse(true); }); } else { gotAvatarServiceResponse(false); } } catch (System.Exception ex) { StateServerAssert.Assert(ex); gotAvatarServiceResponse(false); } }