diff --git a/LibreMetaverse/AppearanceManager.cs b/LibreMetaverse/AppearanceManager.cs
index 48c2d1dc..52264c54 100644
--- a/LibreMetaverse/AppearanceManager.cs
+++ b/LibreMetaverse/AppearanceManager.cs
@@ -257,7 +257,7 @@ namespace OpenMetaverse
#region Event delegates, Raise Events
- /// The event subscribers. null if no subcribers
+ /// The event subscribers. null if no subscribers
private EventHandler m_AgentWearablesReply;
/// Raises the AgentWearablesReply event
@@ -2039,120 +2039,80 @@ namespace OpenMetaverse
/// True if the server baking was successful
private async Task UpdateAvatarAppearanceAsync(CancellationToken cancellationToken, int totalRetries = 3)
{
- if (cancellationToken.IsCancellationRequested)
+ while (true)
{
- return false;
- }
+ if (cancellationToken.IsCancellationRequested) { return false; }
- if (totalRetries < 0)
- {
- return false;
- }
-
- Logger.Log("Updating appearance via bake URL", Helpers.LogLevel.Info, Client);
- var caps = Client.Network.CurrentSim.Caps;
- if (caps == null) { return false; }
-
- var cap = caps.CapabilityURI("UpdateAvatarAppearance");
- if (cap == null) { return false; }
-
- var currentOutfitFolder = GetCurrentOutfitFolder();
- if (currentOutfitFolder == null)
- {
- return false;
- }
- else
- {
- // TODO: create Current Outfit Folder
- }
-
- var request = new OSDMap(1) { ["cof_version"] = currentOutfitFolder.Version };
-
- var msg = "Server side baking failed";
-
- OSD res = null;
-
- var maxRetries = 1000; // About a minute. (50,000ms)
-
- while (maxRetries-- > 0)
- {
- if (!Client.Network.Connected)
+ if (totalRetries < 0)
{
- await Task.Delay(50, cancellationToken);
+ return false;
+ }
+
+ var cap = Client.Network.CurrentSim.Caps?.CapabilityURI("UpdateAvatarAppearance");
+ if (cap == null)
+ {
+ Logger.Log("Could not retrieve UpdateAvatarAppearance region capability",
+ Helpers.LogLevel.Warning, Client);
+ return false;
+ }
+
+ var currentOutfitFolder = GetCurrentOutfitFolder();
+ if (currentOutfitFolder == null)
+ {
+ Logger.Log("Could not retrieve Current Outfit folder",
+ Helpers.LogLevel.Warning, Client);
+ return false;
}
else
{
- var self = GetOwnAvatar();
+ // TODO: create Current Outfit Folder
+ }
- if (self == null)
+ Logger.Log($"Requesting bake for COF version {currentOutfitFolder.Version}",
+ Helpers.LogLevel.Info, Client);
+
+ var request = new OSDMap(1) { ["cof_version"] = currentOutfitFolder.Version };
+
+ OSD res = null;
+
+ var maxRetries = 1000; // About a minute. (50,000ms)
+
+ while (maxRetries-- > 0)
+ {
+ if (!Client.Network.Connected)
{
await Task.Delay(50, cancellationToken);
}
else
{
- break;
+ if (GetOwnAvatar() == null)
+ {
+ await Task.Delay(50, cancellationToken);
+ }
+ else
+ {
+ break;
+ }
}
}
- }
- //Logger.Log($"Passed wait for own avatar, {maxRetries} retries left.", Helpers.LogLevel.Debug, Client);
-
- await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, request, cancellationToken,
- (response, data, error) =>
+ await Client.HttpCapsClient.PostRequestAsync(cap, OSDFormat.Xml, request, cancellationToken, (response, data, error) =>
{
if (error != null)
- {
- msg += $": {error.Message}";
+ {
+ Logger.Log($"UpdateAvatarAppearance failed. Server responded with: {error.Message}",
+ Helpers.LogLevel.Warning, Client);
}
else if (data != null)
- {
+ {
res = OSDParser.Deserialize(data);
}
});
- if (res is OSDMap result)
- {
- if (result.ContainsKey("error"))
+ if (!(res is OSDMap result)) { return false; }
+
+ if (result.ContainsKey("success") && result["success"].AsBoolean())
{
- msg += ": " + result["error"].AsString();
- }
- if (result.ContainsKey("success"))
- {
- /* Sample Reply:
- {
- "agent_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
- "avatar_scale": [0.44999998807907104, 0.6000000238418579, 1.6885325908660889],
- "cof_version": 20,
- "error": null,
- "success": true,
- "textures": ["00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "7b1816e2-2526-8f0b-8205-11cf643ab6a1",
- "e3c1742e-cae2-b920-a80e-3d400b5e5b78", "95dc2db1-46e4-2789-9a58-88845c7c492d", "14599019-a2b5-eb43-a0d6-7e87e28deb48",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "c228d1cf-4b5d-4ba8-84f4-899a0796aa97", "89906514-19b6-f8fa-6868-8ead05383bc0",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000000",
- "00000000-0000-0000-0000-000000000000", "6bf927fd-ac09-b332-f75f-4ca94d37c4cf", "4e138fe7-ffab-ad71-6b30-476ee03f3c8c",
- "30681da5-6d1c-73c6-e391-e698cfc38018", "af04c2ec-8162-9357-3fa8-3a987930be25", "e6e08381-1d19-7280-3fff-a4f3a0ff3fc4"],
- "visual_params": [33, 61, 85, 23, 58, 127, 63, 85, 63, 42, 0, 85, 63, 36, 85, 95, 153, 63, 34, 0, 63, 109, 88, 132, 63, 136,
- 81, 85, 103, 136, 127, 0, 203, 0, 0, 127, 0, 0, 127, 0, 0, 127, 0, 0, 0, 127, 114, 127, 99, 63, 127, 140,
- 127, 127, 0, 0, 0, 191, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 127, 0, 127, 170, 0, 0, 127, 127,
- 109, 85, 127, 127, 63, 85, 42, 100, 216, 214, 204, 204, 204, 51, 25, 89, 76, 204, 0, 127, 0, 0, 144, 85,
- 127, 132, 127, 85, 0, 127, 127, 127, 127, 127, 127, 59, 127, 85, 127, 127, 106, 47, 79, 127, 127, 204, 63,
- 0, 0, 0, 0, 127, 127, 0, 0, 0, 0, 127, 0, 159, 0, 0, 178, 127, 36, 85, 131, 127, 127, 127, 153, 95, 0, 0, 74,
- 27, 127, 127, 0, 214, 204, 198, 0, 0, 63, 30, 127, 226, 255, 198, 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 204, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 0, 127, 127,
- 255, 25, 100, 255, 255, 255, 255, 84, 0, 0, 0, 51, 132, 255, 255, 255, 0, 0, 25, 0, 25, 23, 51, 0, 25, 23, 51,
- 0, 0, 25, 0, 25, 23, 51, 0, 0, 25, 0, 25, 23, 51, 0, 25, 23, 51, 0, 25, 23, 51, 1, 127],
- "warnings": []
- }
- */
var visualParams = result["visual_params"].AsBinary();
var textures = (result["textures"] as OSDArray)?.Select(arrayEntry => arrayEntry.AsUUID()).ToArray();
@@ -2162,15 +2122,15 @@ namespace OpenMetaverse
if (textures != null && textures.Length > 20)
{
- if ((textures[8] == UUID.Zero || textures[9] == UUID.Zero || textures[10] == UUID.Zero || textures[11] == UUID.Zero) ||
- (textures[8] == DEFAULT_AVATAR_TEXTURE || textures[9] == DEFAULT_AVATAR_TEXTURE || textures[10] == DEFAULT_AVATAR_TEXTURE || textures[11] == DEFAULT_AVATAR_TEXTURE))
+ if ((textures[8] == UUID.Zero || textures[9] == UUID.Zero || textures[10] == UUID.Zero || textures[11] == UUID.Zero) || (textures[8] == DEFAULT_AVATAR_TEXTURE || textures[9] == DEFAULT_AVATAR_TEXTURE || textures[10] == DEFAULT_AVATAR_TEXTURE || textures[11] == DEFAULT_AVATAR_TEXTURE))
{
// This hasn't actually baked. Retry after a delay.
await Task.Delay(REBAKE_DELAY, cancellationToken);
- return await UpdateAvatarAppearanceAsync(cancellationToken, totalRetries - 1);
+ totalRetries = totalRetries - 1;
+ continue;
}
}
-
+
try
{
var selfPrim = GetOwnAvatar();
@@ -2185,13 +2145,9 @@ namespace OpenMetaverse
if (textures != null)
{
-
for (var i = 0; i < textures.Length; i++)
{
- selfAvatarTextures.FaceTextures[i] = new Primitive.TextureEntryFace(null)
- {
- TextureID = textures[i]
- };
+ selfAvatarTextures.FaceTextures[i] = new Primitive.TextureEntryFace(null) { TextureID = textures[i] };
}
selfPrim.Textures = selfAvatarTextures;
@@ -2203,15 +2159,15 @@ namespace OpenMetaverse
selfPrim.COFVersion = cofVersion;
selfPrim.AppearanceFlags = 0;
- var appearance = new AvatarAppearanceEventArgs(Client.Network.CurrentSim,
- Client.Self.AgentID,
- false,
- selfPrim.Textures.DefaultTexture,
- selfPrim.Textures.FaceTextures,
- selfPrim.VisualParameters.ToList(), 1,
- cofVersion,
- AppearanceFlags.None,
- selfPrim.ChildCount);
+ var appearance = new AvatarAppearanceEventArgs(Client.Network.CurrentSim,
+ Client.Self.AgentID,
+ false,
+ selfPrim.Textures.DefaultTexture,
+ selfPrim.Textures.FaceTextures,
+ selfPrim.VisualParameters.ToList(), 1,
+ cofVersion,
+ AppearanceFlags.None,
+ selfPrim.ChildCount);
Client.Avatars.TriggerAvatarAppearanceMessage(appearance);
_pendingServerBake = false;
@@ -2219,24 +2175,33 @@ namespace OpenMetaverse
}
catch (Exception e)
{
- Logger.Log("Error applying textures to avatar object: " + e, Helpers.LogLevel.Error, Client);
+ Logger.Log($"Error applying textures to avatar object: {e.Message}", Helpers.LogLevel.Error, Client);
throw;
}
Logger.Log("Returning appearance information from server-side bake request.", Helpers.LogLevel.Info, Client);
return true;
}
- else
+ if (result.ContainsKey("expected"))
{
- // This hasn't actually baked. Retry after a delay.
- await Task.Delay(REBAKE_DELAY, cancellationToken);
- return await UpdateAvatarAppearanceAsync(cancellationToken, totalRetries - 1);
+ Logger.Log($"Server expected {result["expected"].AsInteger()} as COF version. Version {currentOutfitFolder.Version} was sent.",
+ Helpers.LogLevel.Warning, Client);
}
+ if (result.ContainsKey("error"))
+ {
+ var er = result["error"].AsString();
+ if (string.IsNullOrEmpty(er))
+ {
+ Logger.Log($"UpdateAvatarAppearance failed. Server responded with: '{result["error"].AsString()}'",
+ Helpers.LogLevel.Warning, Client);
+ }
+ }
+
+ Logger.Log($"Avatar appearance update failed on {totalRetries} attempt.", Helpers.LogLevel.Info, Client);
+ await Task.Delay(REBAKE_DELAY, cancellationToken);
+ --totalRetries;
+ continue;
}
-
- Logger.Log(msg, Helpers.LogLevel.Error, Client);
-
- return false;
}
///