diff options
author | Dan Lake | 2012-02-14 17:20:34 -0800 |
---|---|---|
committer | Dan Lake | 2012-02-14 17:20:34 -0800 |
commit | 2ebb421331c4e6c4f57e0cc1bab79cea70937172 (patch) | |
tree | 605942c8ef6c594667067b77458ecd205e6006f7 /OpenSim/Region | |
parent | Fix a race condition in the simian groups connector. When requests were (diff) | |
download | opensim-SC_OLD-2ebb421331c4e6c4f57e0cc1bab79cea70937172.zip opensim-SC_OLD-2ebb421331c4e6c4f57e0cc1bab79cea70937172.tar.gz opensim-SC_OLD-2ebb421331c4e6c4f57e0cc1bab79cea70937172.tar.bz2 opensim-SC_OLD-2ebb421331c4e6c4f57e0cc1bab79cea70937172.tar.xz |
Refactor appearance saving for NPC to use AvatarFactoryModule interface.
Diffstat (limited to 'OpenSim/Region')
3 files changed, 38 insertions, 15 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 8d503bd..c7f4c20 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -111,6 +111,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
111 | 111 | ||
112 | #region IAvatarFactoryModule | 112 | #region IAvatarFactoryModule |
113 | 113 | ||
114 | /// </summary> | ||
115 | /// <param name="sp"></param> | ||
116 | /// <param name="texture"></param> | ||
117 | /// <param name="visualParam"></param> | ||
118 | public void SetAppearance(IScenePresence sp, AvatarAppearance appearance) | ||
119 | { | ||
120 | SetAppearance(sp, appearance.Texture, appearance.VisualParams); | ||
121 | } | ||
122 | |||
114 | /// <summary> | 123 | /// <summary> |
115 | /// Set appearance data (texture asset IDs and slider settings) | 124 | /// Set appearance data (texture asset IDs and slider settings) |
116 | /// </summary> | 125 | /// </summary> |
@@ -156,14 +165,23 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
156 | changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; | 165 | changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; |
157 | 166 | ||
158 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); | 167 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); |
159 | if (!ValidateBakedTextureCache(sp)) | 168 | |
169 | // If bake textures are missing and this is not an NPC, request a rebake from client | ||
170 | if (!ValidateBakedTextureCache(sp) && (((ScenePresence)sp).PresenceType != PresenceType.Npc)) | ||
160 | RequestRebake(sp, true); | 171 | RequestRebake(sp, true); |
161 | 172 | ||
162 | // This appears to be set only in the final stage of the appearance | 173 | // This appears to be set only in the final stage of the appearance |
163 | // update transaction. In theory, we should be able to do an immediate | 174 | // update transaction. In theory, we should be able to do an immediate |
164 | // appearance send and save here. | 175 | // appearance send and save here. |
165 | } | 176 | } |
166 | 177 | ||
178 | // NPC should send to clients immediately and skip saving appearance | ||
179 | if (((ScenePresence)sp).PresenceType == PresenceType.Npc) | ||
180 | { | ||
181 | SendAppearance((ScenePresence)sp); | ||
182 | return; | ||
183 | } | ||
184 | |||
167 | // save only if there were changes, send no matter what (doesn't hurt to send twice) | 185 | // save only if there were changes, send no matter what (doesn't hurt to send twice) |
168 | if (changed) | 186 | if (changed) |
169 | QueueAppearanceSave(sp.ControllingClient.AgentId); | 187 | QueueAppearanceSave(sp.ControllingClient.AgentId); |
@@ -174,6 +192,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
174 | // m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString()); | 192 | // m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString()); |
175 | } | 193 | } |
176 | 194 | ||
195 | private void SendAppearance(ScenePresence sp) | ||
196 | { | ||
197 | // Send the appearance to everyone in the scene | ||
198 | sp.SendAppearanceToAllOtherAgents(); | ||
199 | |||
200 | // Send animations back to the avatar as well | ||
201 | sp.Animator.SendAnimPack(); | ||
202 | } | ||
203 | |||
177 | public bool SendAppearance(UUID agentId) | 204 | public bool SendAppearance(UUID agentId) |
178 | { | 205 | { |
179 | // m_log.DebugFormat("[AVFACTORY]: Sending appearance for {0}", agentId); | 206 | // m_log.DebugFormat("[AVFACTORY]: Sending appearance for {0}", agentId); |
@@ -185,12 +212,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
185 | return false; | 212 | return false; |
186 | } | 213 | } |
187 | 214 | ||
188 | // Send the appearance to everyone in the scene | 215 | SendAppearance(sp); |
189 | sp.SendAppearanceToAllOtherAgents(); | ||
190 | |||
191 | // Send animations back to the avatar as well | ||
192 | sp.Animator.SendAnimPack(); | ||
193 | |||
194 | return true; | 216 | return true; |
195 | } | 217 | } |
196 | 218 | ||
@@ -626,4 +648,4 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
626 | outputAction("{0} baked appearance texture is {1}", sp.Name, bakedTextureValid ? "OK" : "corrupt"); | 648 | outputAction("{0} baked appearance texture is {1}", sp.Name, bakedTextureValid ? "OK" : "corrupt"); |
627 | } | 649 | } |
628 | } | 650 | } |
629 | } \ No newline at end of file | 651 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs index 39a760c..34aca33 100644 --- a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs | |||
@@ -35,6 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
35 | 35 | ||
36 | public interface IAvatarFactoryModule | 36 | public interface IAvatarFactoryModule |
37 | { | 37 | { |
38 | void SetAppearance(IScenePresence sp, AvatarAppearance appearance); | ||
38 | void SetAppearance(IScenePresence sp, Primitive.TextureEntry textureEntry, byte[] visualParams); | 39 | void SetAppearance(IScenePresence sp, Primitive.TextureEntry textureEntry, byte[] visualParams); |
39 | 40 | ||
40 | /// <summary> | 41 | /// <summary> |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index dc6eefc..5359354 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -96,15 +96,15 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
96 | if (!m_avatars.ContainsKey(agentId)) | 96 | if (!m_avatars.ContainsKey(agentId)) |
97 | return false; | 97 | return false; |
98 | 98 | ||
99 | // Delete existing sp attachments | ||
99 | scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false); | 100 | scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false); |
100 | 101 | ||
101 | AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true); | 102 | // Set new sp appearance. Also sends to clients. |
102 | sp.Appearance = npcAppearance; | 103 | scene.RequestModuleInterface<IAvatarFactoryModule>().SetAppearance(sp, new AvatarAppearance(appearance, true)); |
104 | |||
105 | // Rez needed sp attachments | ||
103 | scene.AttachmentsModule.RezAttachments(sp); | 106 | scene.AttachmentsModule.RezAttachments(sp); |
104 | 107 | ||
105 | IAvatarFactoryModule module = scene.RequestModuleInterface<IAvatarFactoryModule>(); | ||
106 | module.SendAppearance(sp.UUID); | ||
107 | |||
108 | return true; | 108 | return true; |
109 | } | 109 | } |
110 | 110 | ||