/// <summary> /// Update what the avatar is wearing using an item from their inventory. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void AvatarIsWearing(Object sender, AvatarWearingArgs e) { IClientAPI clientView = (IClientAPI)sender; ScenePresence avatar = m_scene.GetScenePresence(clientView.AgentId); if (avatar == null) { m_log.Error("[APPEARANCE]: Avatar is child agent, ignoring AvatarIsWearing event"); return; } CachedUserInfo profile = m_scene.CommsManager.UserService.GetUserDetails(clientView.AgentId); if (profile != null) { // we need to clean out the existing textures AvatarAppearance appearance = avatar.Appearance; avatar.Appearance.ResetAppearance(); List <AvatarWearable> wearables = new List <AvatarWearable>(); lock (_currentlyWaitingCOFBuilds) { //Check to see whether the client can manage itself if (_cofSyncEnabled && !_viewer2Users.Contains(clientView.AgentId)) { foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) { wearables.Add(new AvatarWearable(wear.Type, wear.ItemID, UUID.Zero)); AvatarWearable oldWearable = appearance.GetWearableOfType(wear.Type); if (wear.ItemID != UUID.Zero) { if (oldWearable == null || oldWearable.ItemID == UUID.Zero || wear.ItemID != oldWearable.ItemID) { bool add = false; Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>(); if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs))) { waitingCOFs = new Dictionary <UUID, BuildCOF>(); } //Make sure that the new item is added if (waitingCOFs.ContainsKey(wear.ItemID)) { BuildCOF cof = waitingCOFs[wear.ItemID]; cof.SetWearableToLookFor(wear.ItemID, m_scene, clientView.AgentId, true); if (cof.Finished()) { waitingCOFs.Remove(wear.ItemID); } } else { BuildCOF cof = new BuildCOF(ClearWaitingCOF); cof.SetWearableToLookFor(wear.ItemID, m_scene, clientView.AgentId, true); waitingCOFs.Add(wear.ItemID, cof); } if (add) { _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs); } } if (oldWearable != null && oldWearable.ItemID != UUID.Zero && wear.ItemID != oldWearable.ItemID) { bool add = false; Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>(); if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs))) { waitingCOFs = new Dictionary <UUID, BuildCOF>(); } //Check for removal of old item if (waitingCOFs.ContainsKey(oldWearable.ItemID)) { BuildCOF cof = waitingCOFs[oldWearable.ItemID]; cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false); if (cof.Finished()) { waitingCOFs.Remove(oldWearable.ItemID); } } else { BuildCOF cof = new BuildCOF(ClearWaitingCOF); cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false); waitingCOFs.Add(oldWearable.ItemID, cof); } if (add) { _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs); } } } else if (oldWearable != null && oldWearable.ItemID != UUID.Zero) { bool add = false; Dictionary <UUID, BuildCOF> waitingCOFs = new Dictionary <UUID, BuildCOF>(); if ((add = !_currentlyWaitingCOFBuilds.TryGetValue(clientView.AgentId, out waitingCOFs))) { waitingCOFs = new Dictionary <UUID, BuildCOF>(); } //Remove the item if it was just removed if (waitingCOFs.ContainsKey(oldWearable.ItemID)) { BuildCOF cof = waitingCOFs[oldWearable.ItemID]; cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false); if (cof.Finished()) { waitingCOFs.Remove(oldWearable.ItemID); } } else { BuildCOF cof = new BuildCOF(ClearWaitingCOF); cof.SetWearableToLookFor(oldWearable.ItemID, m_scene, clientView.AgentId, false); waitingCOFs.Add(oldWearable.ItemID, cof); } if (add) { _currentlyWaitingCOFBuilds.Add(clientView.AgentId, waitingCOFs); } } } } else { foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) { wearables.Add(new AvatarWearable(wear.Type, wear.ItemID, UUID.Zero)); } } } // Wearables are a stack. The entries we have represent the current "top" stack state. Apply them SetAppearanceAssets(profile, ref wearables, clientView); avatar.Appearance.SetWearables(wearables); this.UpdateDatabase(clientView.AgentId, avatar.Appearance, null, null); } else { m_log.WarnFormat("[APPEARANCE]: Cannot set wearables for {0}, no user profile found", clientView.Name); } }