/// <summary> /// Received a DNA update from the client. Save the DNA via the AvatarManagerServiceAPI and broadcast to other clients /// TODO: Verify the dna is valid /// </summary> /// <param name="message"></param> private void RecvDnaUpdate(Message message) { string newDnaString = CheckType.TryAssignType <string>(message.Data[0]); XmlDocument newDna = new XmlDocument(); newDna.LoadXml(newDnaString); mLogger.Info("RecvDnaUpdate: " + mAvatarId.ToString() + ": " + newDnaString); // Get list of ItemIds from DNA List <ItemId> itemIds; AvatarXmlUtil.GetItemIdsFromAvatarDnaNode(newDna, out itemIds); // Get XML of assets from ItemIds XmlDocument assetXml = mServerAssetRepository.GetXmlDna(itemIds); // Replace the DNA in the message with the asset xml message.Data[0] = assetXml.OuterXml; mObjectData[3] = assetXml.InnerXml; // Broadcast the change out BroadcastMessage(message); // Save the dna to the DB AvatarManagerServiceAPI.UpdateAvatarDna(mAvatarId, newDna, delegate(XmlDocument xmlResponse) { mLogger.Info("RecvDnaUpdate, DNA saved: " + mAvatarId.ToString() + "\n" + xmlResponse.OuterXml); }); }
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); } }
/// <summary> /// Get a reference system avatar. This avatar is used to fill in missing required info when pulling an avatar from the db /// </summary> private void GetReferenceAvatar(Action <Dna> gotReferenceAvatarFinished) { Action <XmlDocument> systemAvatarCallback = delegate(XmlDocument xmlResponse) { // Get the avatars for the friends without Hangout Avatars XmlNode avatarXmlNode = xmlResponse.SelectSingleNode("/Avatars/Avatar[@AvatarId='1']"); AvatarId avatarId; List <ItemId> itemIds = null; if (AvatarXmlUtil.GetAvatarInfoFromAvatarXmlNode(avatarXmlNode, out avatarId, out itemIds)) { //use the ServerAssetRepo to composite the List<ItemId> into an XmlNode XmlDocument itemsXml = mServerAssetRepository.GetXmlDna(itemIds); // Get a list of AssetInfos from this xml IEnumerable <AssetInfo> assetInfoList = ServerAssetInfo.Parse(itemsXml); // Make dna mReferenceAvatarDna = new Dna(); mReferenceAvatarDna.UpdateDna(assetInfoList); gotReferenceAvatarFinished(mReferenceAvatarDna); mLogger.Debug("System avatar xml = " + xmlResponse.OuterXml); } else { StateServerAssert.Assert(new Exception("Didn't get a valid system avatar for reference avatar, using an empty DNA")); mReferenceAvatarDna = new Dna(); gotReferenceAvatarFinished(mReferenceAvatarDna); } }; if (mReferenceAvatarDna == null) { AvatarManagerServiceAPI.GetSystemAvatars(systemAvatarCallback); } else { gotReferenceAvatarFinished(mReferenceAvatarDna); } }
private void ReplaceItemIdsWithDna(XmlElement avatarNode) { if (avatarNode == null) { throw new ArgumentNullException("avatarNode"); } if (HasResolvedAssets(avatarNode)) { return; } XmlDocument avatarXmlDoc = avatarNode.OwnerDocument; List <ItemId> avatarItemIds; if (AvatarXmlUtil.GetItemIdsFromAvatarXmlNode(avatarNode, out avatarItemIds)) { XmlDocument assetsXml = mServerStateMachine.ServerAssetRepository.GetXmlDna(avatarItemIds); XmlNode dnaNode = avatarNode.SelectSingleNode("AvatarDna"); if (dnaNode == null) { throw new Exception("avatarNode is not in the expected format.\n" + avatarNode.OuterXml); } dnaNode.RemoveAll(); dnaNode.AppendChild(avatarXmlDoc.ImportNode(assetsXml.SelectSingleNode("//Items"), true)); } else { XmlNode errorNode = avatarXmlDoc.CreateElement("Error"); errorNode.InnerText = "avatarNode does not have the expected format"; avatarNode.AppendChild(errorNode); } }