More incremental changes in AppearanceManager

This commit is contained in:
cinder
2025-01-20 19:01:58 -06:00
parent 2176c9befb
commit ed2d45c40d

View File

@@ -257,7 +257,7 @@ namespace OpenMetaverse
#region Event delegates, Raise Events
/// <summary>The event subscribers. null if no subcribers</summary>
/// <summary>The event subscribers. null if no subscribers</summary>
private EventHandler<AgentWearablesReplyEventArgs> m_AgentWearablesReply;
/// <summary>Raises the AgentWearablesReply event</summary>
@@ -2039,120 +2039,80 @@ namespace OpenMetaverse
/// <returns>True if the server baking was successful</returns>
private async Task<bool> 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;
}
/// <summary>