diff options
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 27 |
2 files changed, 20 insertions, 11 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 5a6b265..716baab 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -196,6 +196,9 @@ namespace OpenSim.Framework | |||
196 | if (appearance.VisualParams != null) | 196 | if (appearance.VisualParams != null) |
197 | m_visualparams = (byte[])appearance.VisualParams.Clone(); | 197 | m_visualparams = (byte[])appearance.VisualParams.Clone(); |
198 | 198 | ||
199 | m_avatarHeight = appearance.m_avatarHeight; | ||
200 | m_hipOffset = appearance.m_hipOffset; | ||
201 | |||
199 | // Copy the attachment, force append mode since that ensures consistency | 202 | // Copy the attachment, force append mode since that ensures consistency |
200 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); | 203 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
201 | foreach (AvatarAttachment attachment in appearance.GetAttachments()) | 204 | foreach (AvatarAttachment attachment in appearance.GetAttachments()) |
@@ -237,7 +240,6 @@ namespace OpenSim.Framework | |||
237 | { | 240 | { |
238 | m_serial = 0; | 241 | m_serial = 0; |
239 | 242 | ||
240 | SetDefaultParams(); | ||
241 | SetDefaultTexture(); | 243 | SetDefaultTexture(); |
242 | 244 | ||
243 | //for (int i = 0; i < BAKE_INDICES.Length; i++) | 245 | //for (int i = 0; i < BAKE_INDICES.Length; i++) |
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 75dbeb8..9037c80 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
210 | changed = sp.Appearance.SetVisualParams(visualParams); | 210 | changed = sp.Appearance.SetVisualParams(visualParams); |
211 | if (sp.Appearance.AvatarHeight > 0) | 211 | if (sp.Appearance.AvatarHeight > 0) |
212 | sp.SetHeight(sp.Appearance.AvatarHeight); | 212 | sp.SetHeight(sp.Appearance.AvatarHeight); |
213 | } | 213 | } |
214 | 214 | ||
215 | // Process the baked texture array | 215 | // Process the baked texture array |
216 | if (textureEntry != null) | 216 | if (textureEntry != null) |
@@ -387,11 +387,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
387 | // m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId); | 387 | // m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId); |
388 | 388 | ||
389 | // we need to clean out the existing textures | 389 | // we need to clean out the existing textures |
390 | sp.Appearance.ResetAppearance(); | 390 | sp.Appearance.ResetAppearance(); |
391 | 391 | ||
392 | // operate on a copy of the appearance so we don't have to lock anything | 392 | // operate on a copy of the appearance so we don't have to lock anything yet |
393 | AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); | 393 | AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false); |
394 | 394 | ||
395 | foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) | 395 | foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) |
396 | { | 396 | { |
397 | if (wear.Type < AvatarWearable.MAX_WEARABLES) | 397 | if (wear.Type < AvatarWearable.MAX_WEARABLES) |
@@ -403,12 +403,19 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
403 | // This could take awhile since it needs to pull inventory | 403 | // This could take awhile since it needs to pull inventory |
404 | SetAppearanceAssets(sp.UUID, ref avatAppearance); | 404 | SetAppearanceAssets(sp.UUID, ref avatAppearance); |
405 | 405 | ||
406 | // could get fancier with the locks here, but in the spirit of "last write wins" | 406 | lock (m_setAppearanceLock) |
407 | // this should work correctly, also, we don't need to send the appearance here | 407 | { |
408 | // since the "iswearing" will trigger a new set of visual param and baked texture changes | 408 | // Update only those fields that we have changed. This is important because the viewer |
409 | // when those complete, the new appearance will be sent | 409 | // often sends AvatarIsWearing and SetAppearance packets at once, and AvatarIsWearing |
410 | sp.Appearance = avatAppearance; | 410 | // shouldn't overwrite the changes made in SetAppearance. |
411 | QueueAppearanceSave(client.AgentId); | 411 | sp.Appearance.Wearables = avatAppearance.Wearables; |
412 | sp.Appearance.Texture = avatAppearance.Texture; | ||
413 | |||
414 | // We don't need to send the appearance here since the "iswearing" will trigger a new set | ||
415 | // of visual param and baked texture changes. When those complete, the new appearance will be sent | ||
416 | |||
417 | QueueAppearanceSave(client.AgentId); | ||
418 | } | ||
412 | } | 419 | } |
413 | 420 | ||
414 | private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) | 421 | private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) |