From 06b1535ec5054068e65a085fabd25680d145594c Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Sat, 17 May 2008 12:45:43 +0000
Subject: while this doesn't fix the initial no pants issue in grid (which
 still baffles me) it does make setting appearance in grid stick.

---
 OpenSim/Region/Environment/Scenes/Scene.cs         | 33 +++++------
 OpenSim/Region/Environment/Scenes/ScenePresence.cs | 22 +++++--
 .../Modules/AvatarFactory/AvatarFactoryModule.cs   | 69 +++++++++++++---------
 3 files changed, 73 insertions(+), 51 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index bc80915..a798f40 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1779,29 +1779,28 @@ namespace OpenSim.Region.Environment.Scenes
 
         protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child)
         {
-            AvatarAppearance appearance;
-            GetAvatarAppearance(client, out appearance);
+            AvatarAppearance appearance = CommsManager.UserService.GetUserAppearance(client.AgentId);
 
             ScenePresence avatar = m_innerScene.CreateAndAddScenePresence(client, child, appearance);
 
             return avatar;
         }
 
-        protected void GetAvatarAppearance(IClientAPI client, out AvatarAppearance appearance)
-        {
-            appearance = CommsManager.UserService.GetUserAppearance(client.AgentId);
-
-            // if (m_AvatarFactory == null ||
-            //     !m_AvatarFactory.TryGetAvatarAppearance(client.AgentId, out appearance))
-            // {
-            //     //not found Appearance
-            //     m_log.Warn("[AVATAR DEBUGGING]: Couldn't fetch avatar appearance from factory, please report this to the opensim mantis");
-            //     byte[] visualParams;
-            //     AvatarWearable[] wearables;
-            //     GetDefaultAvatarAppearance(out wearables, out visualParams);
-            //     appearance = new AvatarAppearance(client.AgentId, wearables, visualParams);
-            // }
-        }
+        // protected void GetAvatarAppearance(IClientAPI client, out AvatarAppearance appearance)
+        // {
+        //     appearance = CommsManager.UserService.GetUserAppearance(client.AgentId);
+
+        //     // if (m_AvatarFactory == null ||
+        //     //     !m_AvatarFactory.TryGetAvatarAppearance(client.AgentId, out appearance))
+        //     // {
+        //     //     //not found Appearance
+        //     //     m_log.Warn("[AVATAR DEBUGGING]: Couldn't fetch avatar appearance from factory, please report this to the opensim mantis");
+        //     //     byte[] visualParams;
+        //     //     AvatarWearable[] wearables;
+        //     //     GetDefaultAvatarAppearance(out wearables, out visualParams);
+        //     //     appearance = new AvatarAppearance(client.AgentId, wearables, visualParams);
+        //     // }
+        // }
 
         /// <summary>
         /// Remove the given client from the scene.
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 6977083..5221914 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -1452,13 +1452,8 @@ namespace OpenSim.Region.Environment.Scenes
         /// </summary>
         public void SendInitialData()
         {
-            // justincc - very temporary fix for the fact that m_apperance appears to be null at this point in grid mode
-            LLObject.TextureEntry texture = AvatarAppearance.GetDefaultTexture();
-            if (null != m_appearance)
-                texture = m_appearance.Texture;
-
             m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, LocalId,
-                                               m_pos, texture.ToBytes(), m_parentID);
+                                               m_pos, m_appearance.Texture.ToBytes(), m_parentID);
 
             if (!m_isChildAgent)
             {
@@ -1467,11 +1462,14 @@ namespace OpenSim.Region.Environment.Scenes
 
             SendFullUpdateToAllClients();
             SendAppearanceToAllOtherAgents();
+            // This is probably egregious
+            m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
         }
 
 
         public void SetWearable(IClientAPI client, int wearableId, AvatarWearable wearable)
         {
+            m_log.Info("[APPEARANCE] Setting wearable with client, wearableid, wearable"); 
             m_appearance.SetWearable(wearableId, wearable);
             m_scene.CommsManager.UserService.UpdateUserAppearance(client.AgentId, m_appearance);
             client.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
@@ -1483,6 +1481,7 @@ namespace OpenSim.Region.Environment.Scenes
         /// <param name="client"></param>
         public void SendOwnAppearance()
         {
+            m_log.Info("[APPEARANCE] Sending Own Appearace");
             ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
         }
 
@@ -1514,19 +1513,30 @@ namespace OpenSim.Region.Environment.Scenes
 
         public void SetAppearance(byte[] texture, List<byte> visualParam)
         {
+            m_log.Warn("[APPEARANCE] Setting Appearance");
             m_appearance.SetAppearance(texture, visualParam);
             SetHeight(m_appearance.AvatarHeight);
             m_scene.CommsManager.UserService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance);
 
             SendAppearanceToAllOtherAgents();
+            SendOwnAppearance();
         }
 
         public void SetWearable(int wearableId, AvatarWearable wearable)
         {
+            m_log.Warn("[APPEARANCE] Setting Wearable"); 
             m_appearance.SetWearable(wearableId, wearable);
             m_scene.CommsManager.UserService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance);
         }
 
+        // Because appearance setting is in a module, we actually need
+        // to give it access to our appearance directly, otherwise we
+        // get a synchronization issue.
+        public AvatarAppearance Appearance {
+            get { return m_appearance; }
+            set { m_appearance = value; }
+        }
+
         /// <summary>
         ///
         /// </summary>
diff --git a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs
index bac2252..f5e0ca2 100644
--- a/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/Modules/AvatarFactory/AvatarFactoryModule.cs
@@ -27,8 +27,11 @@
 
 using System;
 using System.Collections.Generic;
+using System.Reflection;
+
 using System.Threading;
 using libsecondlife;
+using log4net;
 using Nini.Config;
 using OpenSim.Data.Base;
 using OpenSim.Data.MapperFactory;
@@ -41,6 +44,7 @@ namespace OpenSim.Region.Modules.AvatarFactory
 {
     public class AvatarFactoryModule : IAvatarFactory, IRegionModule
     {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
         private Scene m_scene = null;
         private readonly Dictionary<LLUUID, AvatarAppearance> m_avatarsAppearance = new Dictionary<LLUUID, AvatarAppearance>();
 
@@ -215,31 +219,31 @@ namespace OpenSim.Region.Modules.AvatarFactory
                 m_scene = scene;
             }
 
-            if (!m_configured)
-            {
-                m_configured = true;
-                try
-                {
-                    m_enablePersist = source.Configs["Startup"].GetBoolean("appearance_persist", false);
-                }
-                catch (Exception)
-                {
-                }
-                if (m_enablePersist)
-                {
-                    m_connectionString = source.Configs["Startup"].GetString("appearance_connection_string", "");
-
-                    string mapperTypeStr = source.Configs["Startup"].GetString("appearance_database", "MySQL");
-
-                    DataMapperFactory.MAPPER_TYPE mapperType =
-                        (DataMapperFactory.MAPPER_TYPE)
-                        Enum.Parse(typeof (DataMapperFactory.MAPPER_TYPE), mapperTypeStr);
-
-                    m_databaseMapper = DataMapperFactory.GetDataBaseMapper(mapperType, m_connectionString);
-
-                    m_appearanceMapper = new AppearanceTableMapper(m_databaseMapper, "AvatarAppearance");
-                }
-            }
+            // if (!m_configured)
+            // {
+            //     m_configured = true;
+            //     try
+            //     {
+            //         m_enablePersist = source.Configs["Startup"].GetBoolean("appearance_persist", false);
+            //     }
+            //     catch (Exception)
+            //     {
+            //     }
+            //     if (m_enablePersist)
+            //     {
+            //         m_connectionString = source.Configs["Startup"].GetString("appearance_connection_string", "");
+
+            //         string mapperTypeStr = source.Configs["Startup"].GetString("appearance_database", "MySQL");
+
+            //         DataMapperFactory.MAPPER_TYPE mapperType =
+            //             (DataMapperFactory.MAPPER_TYPE)
+            //             Enum.Parse(typeof (DataMapperFactory.MAPPER_TYPE), mapperTypeStr);
+
+            //         m_databaseMapper = DataMapperFactory.GetDataBaseMapper(mapperType, m_connectionString);
+
+            //         m_appearanceMapper = new AppearanceTableMapper(m_databaseMapper, "AvatarAppearance");
+            //     }
+            // }
         }
 
         public void PostInitialise()
@@ -273,13 +277,14 @@ namespace OpenSim.Region.Modules.AvatarFactory
         public void AvatarIsWearing(Object sender, AvatarWearingArgs e)
         {
             IClientAPI clientView = (IClientAPI)sender;
+            ScenePresence avatar = m_scene.GetScenePresence(clientView.AgentId);
             CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(clientView.AgentId);
-            AvatarAppearance avatAppearance = m_scene.CommsManager.UserService.GetUserAppearance(clientView.AgentId);
+            AvatarAppearance avatAppearance = avatar.Appearance;
+            m_log.Info("Calling Avatar is Wearing");
             if (profile != null)
             {
                 if (profile.RootFolder != null)
                 {
-
                     foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
                     {
                         if (wear.Type < 13)
@@ -292,7 +297,7 @@ namespace OpenSim.Region.Modules.AvatarFactory
                             else
                             {
                                 LLUUID assetId;
-
+                                
                                 InventoryItemBase baseItem = profile.RootFolder.FindItem(wear.ItemID);
 
                                 if (baseItem != null)
@@ -301,10 +306,18 @@ namespace OpenSim.Region.Modules.AvatarFactory
                                     avatAppearance.Wearables[wear.Type].AssetID = assetId;
                                     avatAppearance.Wearables[wear.Type].ItemID = wear.ItemID;
                                 }
+                                else 
+                                {
+                                    m_log.ErrorFormat("[APPEARANCE] Can't find inventory item {0}, not wearing", wear.ItemID);
+                                }
                             }
                         }
                     }
                     m_scene.CommsManager.UserService.UpdateUserAppearance(clientView.AgentId, avatAppearance);
+                } 
+                else 
+                {
+                    m_log.Error("Root Profile is null, we can't set the appearance");
                 }
             }
         }
-- 
cgit v1.1